在另一个文件c ++中的前向声明

Posted

技术标签:

【中文标题】在另一个文件c ++中的前向声明【英文标题】:forward declaration in another file c++ 【发布时间】:2012-04-21 18:08:09 【问题描述】:

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

#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 类都相互依赖,并且都有另一个类型的对象。我所做的是在另一个文件中前向声明这两个类。有没有一种干净的方法可以做到这一点?

【问题讨论】:

你需要打破这个循环。尝试考虑如果您尝试创建 A 的实例会发生什么。(创建 A,需要创建 B,需要为此创建 A,需要为此创建 B,...) 这就是耦合。不是吗?为什么需要彼此的定义?具体例子?如果它们的功能如此相似,你能把它们变成子类吗? @CppLearner "你为什么需要彼此的定义?"我的错误 虽然很糟糕,但归根结底这是一个设计问题。因此,您实际上应该提供两个类的实际名称以及它们的作用。从那里我们可以帮助找出最佳设计实践。 您需要(或者更确切地说,应该)为此使用指针。 【参考方案1】:

一般来说,跨标头前向声明类是合法的。

但是,在您的示例中,您正在彼此实例化两个类,这绝对是非法的!

要说明这背后的原因,请考虑以下几点:

ClassA 在没有b 的情况下占用1 个字节,ClassB 也在没有a 的情况下占用1 个字节。 现在,包括 bClassA 现在占用 2 个字节。现在包括 aClassB 现在占用 3 个字节。由于ClassB 的大小增加,现在我们必须将ClassA 的大小更新为4 个字节。按照这个逻辑,ClassB 现在是 5 个字节,ClassA 6 个字节,ClassB 7 个字节......

为了解决这个问题,您可能希望将(至少)ab 之一的类型更改为指向相应类的指针或引用。执行此操作时(在 c/c++ 中),请确保您了解内存管理!

您原来的问题的解决方案可能如下所示:

ClassA.h

#pragma once
class ClassB;
class ClassA

public:
    ClassB* b;

ClassB.h

#pragma once
#include "ClassA.h"
class ClassB

public:
    ClassA a;

请注意,ClassB.h 需要 ClassA.h,因为出于演示目的:ClassB 包含 ClassA 类型的完整对象,因此需要 ClassA 的定义!

【讨论】:

【参考方案2】:

是的。但是你应该使用ClassA* a;ClassA& a;而不是ClassA a;(在cpp文件中有相应的初始化) 因为没有关于ClassA 大小的信息来计算ClassB 的大小。

【讨论】:

以上是关于在另一个文件c ++中的前向声明的主要内容,如果未能解决你的问题,请参考以下文章

C++ 中的前向引用或声明

c语言 在任一个文件中定义外部变量Num,解释这句话

单片机Keil C51 C语言多文件如何使用全局位变量?跪拜!!

C++工程中如何在一个文件中调用另一个文件中的变量

思考题一

C# Azure.Storage.Blobs SDK 如何列出和压缩容器中的所有文件并将压缩文件存储在另一个容器中