在另一个头文件中转发声明是否合法?例如:
#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
在没有 b
的情况下取 1 个字节,让 ClassB
在没有 a
的情况下取 1 个字节。
现在,包括 b
:ClassA
现在需要 2 个字节。现在包括 a
:ClassB
现在需要 3 个字节。由于 ClassA
的大小增加,现在我们必须将 ClassB
的大小更新为 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
的定义!关于c++ - 在另一个文件 C++ 中的前向声明,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10261619/