C++ push_back是否会改变存储在其向量中的类型的结构?
我有以下两门课:C++ push_back是否会改变存储在其向量中的类型的结构?,c++,nullpointerexception,stdvector,push-back,C++,Nullpointerexception,Stdvector,Push Back,我有以下两门课: class Core { public: Core() : mid(0), fin(0) {} Core(std::istream &in) { read(in); } virtual ~Core() {} Str name() const { return n; } virtual double grade() const { return
class Core
{
public:
Core() : mid(0), fin(0) {}
Core(std::istream &in)
{
read(in);
}
virtual ~Core() {}
Str name() const
{
return n;
}
virtual double grade() const
{
return vec_grade(mid, fin, hws);
}
virtual std::istream &read(std::istream &in);
protected:
std::istream &read_common(std::istream &in);
double mid, fin;
Vec<double> hws;
virtual Core *clone() const
{
return new Core(*this);
}
private:
friend class Student2;
Str n;
};
std::istream &Core::read_common(std::istream &in)
{
in >> n >> mid >> fin;
return in;
}
std::istream &Core::read(std::istream &in)
{
read_common(in);
read_vec(in, hws);
return in;
}
在这里,我读入objectstudent2,对象将有它的地址。但一旦我通过push_back将其添加到vector中,不知何故丢失的同一对象的地址将被空指针指向。我不知道push_back如何修改它的值,但它不应该修改,因为否则它会得到它的值。什么会将_推回其值?它使用您编写的复制构造函数。这个:
Student2(const Student2 &s) : cp(0)
{
if (s.cp)
s.cp->clone();
}
它将cp设置为null 0。这就是副本的cp为空的原因。我会投票以打字错误结束,但既然已经有了一个投票结果。。。在复制构造函数s.cp->clone中;应该是cp=s.cp->clone;我假设OP打算执行cp=s.cp->clone@cigien我也这么认为,但我认为没有明确提到这一点可能会创造一个更好的学习机会。是的,这是打字错误。但关键是,当使用std::istream而不是copy构造函数构造对象时,cp被设置为0,因此它有地址,push_-back不应该更改类型,除非它确实复制构造函数(看起来是这样),因为cp是0。那么为什么push_back copy构造只应该将对象的地址分配给向量的末尾呢?push_back的实现是什么?@milanHrabos它是Student2s的向量,而不是指向Student2s的指针向量。地址不在向量中,而是整个对象。对象无法更改其地址,因此它必须创建一个新的对象作为副本。
int main()
{
vector<Student2> v;
Student2 s(cin);
v.push_back(s);
printf("%p\n%p\n", s.getPointer(), v[0].getPointer());
}
0x562fa03b9280
(nil)
Student2(const Student2 &s) : cp(0)
{
if (s.cp)
s.cp->clone();
}