在下面的示例中,我希望能够访问函数cList
中类B
中的向量ShareData
。我该怎么办?
我已经编写了示例代码。它无法编译(错误消息:B没有构造函数)。即使这样做,行cObj = new B(*this);
是否引入了任何循环依赖关系?
#include "stdafx.h"
#include <vector>
class B;
class A
{
public:
B* cObj;
std::vector<B*> cList;
A()
{
cObj = new B(*this);
}
};
class B
{
public:
B(A& aObj) : aObjLocal(aObj) {};
void ShareData(int result)
{
for (auto& iterator : aObjLocal.cList)
{
(*iterator).ShareData(result);
}
}
private:
A& aObjLocal;
};
void main()
{
A aMain;
B bMain(aMain);
bMain.ShareData(10);
}
预先感谢您分享知识。
答案 0 :(得分:2)
在使用正向声明时,需要确保在完全定义类型之后对需要完整类型的正向声明类型进行任何使用。
对于您而言,这意味着您的代码应如下所示:
class B;
class A
{
public:
B* cObj;
std::vector<B*> cList;
A();
};
class B {
...
};
inline A::A()
{
cObj = new B(*this);
}
此外,您当然希望摆脱拥有B*
,而在那儿使用std::unique_ptr
。
答案 1 :(得分:1)
cObj = new B(*this);
您尚未在此处使用B,因为尚未定义。
将其放在B的定义下:
A::A()
{
cObj = new B(*this);
}
并删除内联定义。
答案 2 :(得分:1)
行
cObj = new B(*this);
在A
的构造函数中不起作用,因为B
的定义在该行不可见。定义A
后,移动B
的构造函数的实现。
class A { ... };
class B { ... };
inline A::A()
{
cObj = new B(*this);
}