何时在C++中使用类的声明
When is declaration of a class used in C++?
由于类定义是内部链接,因此我们必须在使用之前定义一个类。我无法弄清楚使用类声明的情况,例如class A;
.有吗?
它用于前向声明;假设两个类有一个指向彼此实例的指针或提及:
class A;
class B;
class A {
class B*ptr;
int x;
/// etc
};
class B : A {
std::string s;
std::vector<A> v;
//// etc
};
它对于可读性也很有用;您可能希望在某个标头中首先列出所有类。
你可以只转发声明一个类,并简单地使用它的指针而不定义该类。
顺便说一下,C99 对 struct
、union
有类似的前向声明;前向声明函数也很有用。
这是一个前向声明,它是一种处理头文件中循环依赖关系的方法。
例如,如果两个类各自保存一个指向另一个类的指针,则需要转发声明在翻译单元中进一步定义的类。
您询问是否需要前向声明。
想象一下以下假设示例:
class Man
{
Woman mySpouse;
};
class Woman
{
Man mySpouse;
};
我们必须在使用之前定义一个类。
是的。所以你可以看到上面的例子,这是不可能的先有鸡还是先有蛋的情况(又名循环依赖)。这就是为什么您需要前向声明和指针的原因,如下所示:
class Man; // Forward declaration
class Woman; // Forward declaration
class Man
{
Woman * pMySpouse;
};
class Woman
{
Man * pMySpouse;
};
感谢前向声明,这应该可以正常工作。
查看此问题的答案:何时可以使用前向声明?
相关文章:
- .cpp和.h文件中的模板专用化声明
- 未在作用域中声明unordered_map
- C++避免重复声明的语法是什么
- 如何确保C++函数在定义之前声明(如override关键字)
- 错误:未在此范围内声明'reverse'
- 奇怪的(对我来说)返回声明 - 在谷歌上找不到任何关于它的信息
- 为什么在定义函数之前先声明它
- 如何声明特征矩阵,然后通过嵌套循环初始化它
- #ifdef和未声明的标识符
- 没有显式声明的int[]中的foreach
- 在基于范围的for循环中使用结构化绑定声明
- 在将变量声明为引用时,堆在释放后使用
- C++:无法访问声明的受保护成员
- 为什么我不能在一个类的不同行中声明和定义成员变量?
- 我不明白为什么我声明一个空的内部结构并将其传递给构造函数
- 使用cmake从源代码构建MySQL连接器/C++失败(与以前的声明冲突)
- 在函数内部的声明中初始化数组,并在外部使用它
- Visual Studio中的函数声明和函数定义问题
- c++类声明时,相同的例程,不同的成员变量类型
- 在 .h 文件中的类中声明静态变量和在.cpp文件中声明"global"变量有什么区别