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

How to make these c++ class declarations work

本文关键字:声明 工作 c++ 何使这      更新时间:2023-10-16

我目前正在阅读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之前定义。但现在我们又回到了最初的问题。我认为这叫做循环依赖?我不知道如何用正向声明来解决这个问题。

如有任何帮助,我们将不胜感激。谢谢

我认为您要么必须使整个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)} { }