如何使这些c ++类声明工作

时间:2014-04-25 02:38:31

标签: c++ declaration friend forward

我目前正在阅读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之前定义。但是现在我们已经回到原来的问题了。我认为这被称为循环依赖?我不知道如何通过前向声明解决这个问题。

任何帮助将不胜感激。感谢。

1 个答案:

答案 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)} { }