在另一个头文件中转发声明是否合法?例如:

#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 个字节......

为了解决这个问题,您可能希望将(至少)ab 之一的类型更改为指向相应类的指针或引用。执行此操作时(在 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/

10-11 18:50