【问题标题】:Defining class which is part of another class in a different file在不同的文件中定义属于另一个类的类
【发布时间】:2026-01-24 04:50:01
【问题描述】:

考虑以下代码:

class App{
    public:
    struct A{
        int foo;
    };
    struct B{
        double bar;
    };
};

单独的头文件(egah & bh)中定义类 A 和 B 然后将它们包含在 class App 中以便它们成为其中的一部分的适当方法是什么?

【问题讨论】:

  • 做你写的?我不确定我是否明白你在问什么。你试过这个吗?有什么特别的问题吗?
  • 我写的内容没有问题,但我已经简化了这段代码,实际上我的结构 A 和 B 使用它们的特定方法等要大得多,这将有助于我的可读性如果我只是在不同的文件中有这些定义的代码。
  • 是什么阻止你这样做?
  • 大量代码(打算使用类 App 的人不应该关心)浪费空间。无论如何我只是一个初学者,也许我现在对此研究太多了,但无论如何,将#include 指令放在类定义的中间是否是一种不好的做法?

标签: c++ class struct header


【解决方案1】:

定义嵌套类的唯一方法是将定义放在另一个类中。从技术上讲,该语言不会阻止从另一个文件中包含该定义:

// outer.hpp
#pragma once    

struct outer
{
#include "inner.hpp"
};

// inner.hpp
struct inner {

};

但是,将文件包含到除全局命名空间之外的任何其他范围内都是非常规的,我建议不要这样做。

我建议重新考虑一个类嵌套在另一个类中是否有好处。如果有,那么最好接受这将是一个很长的定义。

【讨论】:

  • 好的,这似乎涵盖了我所有的问号。您能否详细说明将文件包含到不同于全局的命名空间中?
【解决方案2】:

只需将它们移动到单独的标题中即可。使用标头保护来防止单独包含单个标头以及 app.h 标头。并为结构成员分配名称。

a.h

#ifndef A_H
#define A_H

struct A {
    int foo;
};

#endif

b.h

#ifndef B_H
#define B_H

struct B {
    int bar;
};

#endif

app.h:

#ifndef APP_H
#define APP_H

class App {
    public:
    A a;
    B b;
};

#endif

【讨论】:

  • 我不需要直接在 App 类中的 A 和 B 类型的对象的实例。
  • 你特别说然后将它们包含在类 App 中,以便它们成为它的一部分
最近更新 更多