我目前正在阅读C ++ Primer,我正处于班级朋友和成员函数朋友的角度,我无法弄清楚如何获得具有以下假形的代码:
class B;
class A {
public:
A(int i): someNum(i) { }
private:
int someNum;
friend void B::someMemberFunction(Args); // Compile error: Incomplete Type
};
class B {
public:
void someMemberFunction(Args) { /* doStuff */ }
private:
vector<A> someVector { A(5) };
};
如果您尝试使用此表单进行编译,则会在好友行上显示不完整的类型错误。所以解决方案是将B类定义移到A类之上:
class A;
class B {
public:
void someMemberFunction(Args) { /* doStuff */ }
private:
vector<A> someVector { A(5) }; // Compile error: Incomplete Type
};
class A {
public:
A(int i): someNum(i) { }
private:
int someNum;
friend void B::someMemberFunction(Args);
};
然而现在在矢量线上,它不知道如何创建A类型的对象,因为A尚未定义。那么A需要在B之前定义。但是现在我们已经回到原来的问题了。我认为这被称为循环依赖?我不知道如何通过前向声明解决这个问题。
任何帮助将不胜感激。感谢。
答案 0 :(得分:0)
我认为你要么必须让整个class B
成为朋友(无论如何都会删除A
中的依赖项,因此它可能是一件好事),或者使用构造函数代替类内初始化程序。
class B;
class A {
public:
A(int i): someNum(i) { }
private:
int someNum;
friend class B;
};
class B {
public:
void someMemberFunction() { /* doStuff */ }
private:
vector<A> someVector { A(5) };
};
或者这个
class A;
class B {
public:
B();
void someMemberFunction() { /* doStuff */ }
private:
vector<A> someVector;
};
class A {
public:
A(int i): someNum(i) { }
private:
int someNum;
friend void B::someMemberFunction();
};
B::B(): someVector{A(5)} { }