STL列表和朋友类 - 没有得到理想的结果

时间:2012-09-06 22:38:39

标签: c++ list stl friend

我的目的是在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

}

嗯,程序编译没有任何困难,但是当我运行程序时,我没有得到所需的结果。

对于B,我有两个构造函数,一个默认值为零,另一个构造函数接受输入以初始化内部变量。

当我使用第二个来初始化私有变量时,那么在A.Update方法中,所有内容都归零,看起来我会使用默认构造函数。

我做错了吗?我的方法是否正确?

谢谢!

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

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

std::list<B> Blist;

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

std::list<B*> Blist;

保留指针列表而不是对象将允许A对象访问已创建的B项,而不是创建一个新的B对象,它位于列表中。

答案 2 :(得分: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);

应该解决你的问题。