C++ 在另一个文件c+中转发声明+;
在另一个头文件中转发声明是否合法?例如:C++ 在另一个文件c+中转发声明+;,c++,forward-declaration,C++,Forward Declaration,在另一个头文件中转发声明是否合法?例如: #ifndef _MAIN_H_ #define _MAIN_H_ class ClassA; class ClassB; #include "classa.h" #include "classb.h" #endif #ifndef _CLASSA_H_ #define _CLASSA_H_ #include "main.h" class ClassA { public: ClassB b; }; #endif #ifndef _CLASSB
#ifndef _MAIN_H_
#define _MAIN_H_
class ClassA;
class ClassB;
#include "classa.h"
#include "classb.h"
#endif
#ifndef _CLASSA_H_
#define _CLASSA_H_
#include "main.h"
class ClassA
{
public:
ClassB b;
};
#endif
#ifndef _CLASSB_H_
#define _CLASSB_H_
#include "main.h"
class ClassB
{
public:
ClassA a;
};
#endif
类A和类B都相互依赖,并且都有另一种类型的对象。我所做的是在另一个文件中向前声明这两个类。有没有干净的方法可以做到这一点?是的。但是你应该使用
ClassA*a代码>或a类和a类代码>而不是ClassA代码>(在cpp文件中有相应的初始化)
由于没有关于ClassA
大小的信息来计算ClassB
的大小,因此通常在头之间转发声明类是合法的
但是,在您的示例中,您正在彼此实例化这两个类,这是绝对非法的
为了说明这背后的原因,请考虑以下几点:
让ClassA
在不带b
的情况下取1个字节,在不带a的情况下取ClassB
也取1个字节。
现在,includeb
:ClassA
现在需要2个字节。现在包含a
:ClassB
现在需要3个字节。现在,由于ClassB
的大小增加,我们必须将ClassA
的大小更新为4字节。接下来的逻辑ClassB
现在是5个字节,ClassA
6个字节,ClassB
7个字节
为了解决这个问题,您可能希望将a
和b
中的一个(至少)类型更改为指向相应类的指针或引用。执行此操作时(在c/c++中),请确保您了解内存管理
原始问题的解决方案如下所示:
A.h级
#pragma once
class ClassB;
class ClassA
{
public:
ClassB* b;
}
B.h类
#pragma once
#include "ClassA.h"
class ClassB
{
public:
ClassA a;
}
请注意,ClassB.h需要ClassA.h,因为出于演示目的:ClassB
包含类型为ClassA
的完整对象,因此需要定义ClassA
你需要打破这个循环。试着想想如果你试图创建一个A的实例会发生什么(创建A,需要创建B,需要创建A,需要创建B),这就是耦合。不是吗?为什么你们需要对方的定义?具体例子?如果它们的功能如此相似,你能把它们分成子类吗?@CppLearner“为什么你们需要彼此的定义?”我的错误,虽然这很糟糕,但实际上这是一个设计问题。因此,您应该提供这两个类的实际名称以及它们的作用。从那里,我们可以帮助您找出最佳设计实践。您需要(或者更确切地说,应该)为此使用指针。