Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/154.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ push_back是否会改变存储在其向量中的类型的结构?_C++_Nullpointerexception_Stdvector_Push Back - Fatal编程技术网

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();
}