【问题标题】:C++ vector not saving the parent of an objectC++ 向量不保存对象的父对象
【发布时间】:2022-11-17 00:25:57
【问题描述】:

假设我有这样的class A

class A {
    public:int num;
    public:A* parent;

    A(){};

    A::A (const A &s)
    {
            this->num = s.num;
    }
};

                                                                                                                                   

在 main 函数中,我从 A 类中创建了两个对象

int main()
{
    A a1;
    a1.num = 2;
    
    A a2 = a1;
    a2.parent = &a1;
    
    cout << a2.parent->num << endl;

    return 0;
}

它显然会打印 2 但是当我制作 A 类的向量并将 a2 对象推入向量时像这样


int main()
{
    A a1;
    a1.num =2;
    
    A a2 = a1;
    a2.parent = &a1;
    
    vector <A> List;
    List.push_back(a2);
    

    A temp = List.front();
    
    cout << temp.parent->num << endl;

    return 0;
}

cmd 正在崩溃并且不打印任何内容。谁能帮帮我。

PS:我不知道在深层复制构造函数中将第二个对象分配给第一个对象的父对象的正确方法是什么,这就是我手动分配它的原因。

【问题讨论】:

  • 您的A 复制构造函数仅复制num,它不会复制或以其他方式初始化parent 成员变量。所以 temp.parent 将被取消初始化不定值,导致未定义的行为当您取消引用指针时。
  • 此特定示例的简单解决方法:删除复制构造函数。

标签: c++ class vector cmd reference


【解决方案1】:

你的问题在这里:

A::A (const A &s)
{
        this->num = s.num;
}

这是一个复制构造函数。它在A temp = List.front(); 上触发

但是,它不会设置 this-&gt;parent,它仍未初始化。因此,下一行,当您执行 temp.parent-&gt;num 时,您将访问未初始化的内存。

你还应该这样做:

A::A (const A &s)
{
        this->num = s.num;
        this->parent = s.parent;
}

但是花点时间看看三的法则。并且知道 vector 将重新分配并可能使某些对象的地址无效。如果您将向量中的一个对象设置为另一个对象的父对象,这将给您带来麻烦。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-02-22
    • 1970-01-01
    • 2012-09-21
    • 1970-01-01
    • 1970-01-01
    • 2011-06-14
    • 1970-01-01
    相关资源
    最近更新 更多