-1

我的意图是在 A 类中存储 B 对象的列表,但是当我调用 B 构造函数时,我希望在 A 列表中创建一个新元素。

我有这样的代码:

class A
{...
    protected:
      std::list<B> Blist;
      std::list<B>::iterator Bit;
 ...
    public:
      Update();
 ...
    friend class B;
}


class B
{...
    protected:
       A* p_A;
 ...
    public:
       B(); //Standard constructor
       B(A* pa); // This is the constructor I normally use
}


B::B(A* pa)
{
    p_A=pa; // p_A Initialization

    p_A->Bit = p_A->Blist.insert(p_A->Blist.end(), *this);
}

A::Update()
{

   for(Bit=Blist.begin(); Bit != Blist.end(); Bit++)
   {
     (*Bit).Draw() //Unrelated code
   }

}

void main() //For the sake of clarity
{

    A* Aclass = new A;
    B* Bclass = new B(A);

    Aclass.Update(); // Here is where something goes wrong; current elements on the list are zeroed and data missed

}

好吧,程序编译没有困难,但是当我运行程序时,我没有得到想要的结果。

对于 BI,有两个构造函数,一个默认将所有内容归零,另一个接受输入以初始化内部变量。

当我使用第二个初始化私有变量时,然后在 A.Update 方法期间,一切都归零,看起来我会使用默认构造函数。

难道我做错了什么?我的方法正确吗?

谢谢!

编辑:为清晰而编辑的程序

4

3 回答 3

2

您可能想在取消引用之前尝试初始化 p_A。

于 2012-09-06T22:49:11.247 回答
1
std::list<B> Blist;

这是B 类型list对象 。当你 时insert(iterator,value),你给列表一个要复制的值。这会生成一个B由列表保存的新对象,该对象由复制构造函数创建。如果B的复制 ctor 没有执行您需要的初始化步骤,则该对象将不会处于您期望的状态。

std::list<B*> Blist;

保留指针列表而不是对象将使A对象能够访问B已创建的项目,而不是创建位于B列表中的新对象。

于 2012-09-07T00:15:49.890 回答
0

改变:

std::list<B> Blist;
std::list<B>::iterator Bit;

std::list<B*> Blist;
std::list<B*>::iterator Bit;

p_A->Bit = p_A->Blist.insert(p_A->Blist.end(), *this);

p_A->Bit = p_A->Blist.insert(p_A->Blist.end(), this);

应该能解决你的问题。

于 2012-09-07T09:57:43.320 回答