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个字节。 现在,include
b
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“为什么你们需要彼此的定义?”我的错误,虽然这很糟糕,但实际上这是一个设计问题。因此,您应该提供这两个类的实际名称以及它们的作用。从那里,我们可以帮助您找出最佳设计实践。您需要(或者更确切地说,应该)为此使用指针。