我的目的是在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方法中,所有内容都归零,看起来我会使用默认构造函数。
我做错了吗?我的方法是否正确?
谢谢!
编辑:为清晰度而编辑的程序
答案 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);
应该解决你的问题。