如何使这些c++类声明工作
How to make these c++ class declarations work
我目前正在阅读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)} { }
相关文章:
- 如果不在窗口 10 中声明名为 openCV 的 openCV namedWindow,QT 图像显示将无法正常工作
- 声明C++具有动态大小的数组类型在 Linux 中工作正常,但不能在 Windows 中工作
- 为什么C++需要公共继承,忽略朋友声明,才能使动态向下工作?
- 为什么我不能声明一个 constexpr 本地,而一个 const 一个工作?
- 代码作为 C 文件工作,但不作为C++文件,错误:'__builtin_types_compatible_p'未在此范围内声明
- 使赋值运算符在声明上工作
- 友元类不工作 C++ 、'class T'阴影模板参数的声明
- void(*var_name)(data_type) - 该声明如何工作
- 当通过声明表达式调用时,static_assert应该可以工作
- 功能仅声明,但仍在工作
- 我如何使用关系 btwn 3 整数来确定三角形和/或我可以使用什么声明来使这个程序工作
- __cplusplus宏告诉 g++ C 标头声明工作不奇怪
- 这C++模板成员函数声明如何工作
- 隐式声明(对象级)成员函数如何根据 ISO C++11 标准工作
- 即使在使用函数之前没有函数声明,C++ 程序也可以工作
- 在正向声明的情况下,编译器是如何工作的,Makefile是如何发挥作用的
- 类数组是如何工作的(c++)?它在声明时得到内存吗
- 数组声明如何在C++中工作
- glActiveTesture和GL_TEXTURE0不工作,都是未声明的标识符
- 如何使这些c++类声明工作