gpt4 book ai didi

c++ - 如何使这些 C++ 类声明起作用

转载 作者:太空宇宙 更新时间:2023-11-04 13:51:16 24 4
gpt4 key购买 nike

我目前正在阅读 C++ Primer 并且正处于类 friend 和成员函数 friend 的位置,我无法弄清楚如何让具有以下伪形式的代码工作:

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) };
};

如果您尝试以这种形式编译,它会在 friend 行上给出不完整的类型错误。所以解决方案是将 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);
};

但是现在在 vector 线上,它不知道如何创建类型 A 的对象,因为 A 尚未定义。那么 A 需要在 B 之前定义。但是现在我们又回到了最初的问题。我认为这称为循环依赖?我不知道如何用前向声明解决这个问题。

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

最佳答案

我想你要么必须让整个 class B 成为 friend (这会移除 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)} { }

关于c++ - 如何使这些 C++ 类声明起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23283253/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com