在一个.cpp文件中定义多个类是否可行?

12

我在学校做一个项目,老师要求所有代码都放在一个.cpp文件中(为了他更方便地打分)。我想在这个文件中定义多个类,这样做会遇到什么问题吗?


2
你可以将你的类放在任何头文件中,然后运行gcc -E,并发送输出给讲师。不要真的这样做,因为(a)你的讲师会拒绝阅读它,(b)所有标准头文件的插入都会触发抄袭警报。但是,如果你看一下那个输出,并注意到它是可编译的,你就会发现你可以在cpp文件中做任何你想做的事情,就像在头文件中一样。 - Steve Jessop
2
如果您的教师要求您提交单个文件,那么假设您的编程语言允许这样做是合理的,您有什么理由对此表示怀疑? - Rob Kennedy
1
@Rob:很好的观点,考虑到我们知道答案,但是请考虑教师经常会强制执行如下条件:“不使用递归调用,仅使用循环”;“仅使用递归调用,不使用循环”;以及一般情况下,“倒挂着,手背后绑着一只手”。毫无疑问这是出于良好的教学原因,但这也意味着您的假设并不总是正确或合理;) - Steve Jessop
1
@Rob,也许教练从未想过他们会使用多个类? - Steve Smith
11个回答

33

没有像Java一样需要遵循的规则。您可以自由地将类放在任何已命名文件中(除了后缀)。

然而,这是否是良好的实践另当别论(不是!)。


4
此外,不要忘记在主类之前放置你将要使用的类,否则编译器将找不到它们。(除非使用前向声明) - DaMacc
这并不总是最佳实践,但如果您在内部使用结构体或类,则在源文件中定义它们似乎足够好。当您更改它们的声明时,这很有用,您不必编译其他源文件。 - Louis Go

14

是的,你可以。这很容易验证。

class C
{
};

class D
{
};

int main(int argc, char**argv)
{
  return 0;
}

9
尽管通常的 C++ 声明适用,即“你的编译器接受它并不意味着它在 C++ 标准上是允许的”,但在这种情况下,它当然是完全有效的。 - jalf

7
你可以在同一个文件中完美地声明和定义多个类。
但是,当一个类依赖于稍后出现的另一个类时,你需要小心。如果类A是另一个类B的成员,编译器需要完整的声明(以便它知道其大小),并且你需要将其放在文件的较高位置。然而,如果该成员只是一个指针(它的大小独立于所指向的类的大小),则指向的类的简单前向声明就足够了。
请注意,在使用#include机制时,这基本上就是发生的事情:预处理器将所有包含的文件“复制粘贴”到正在编译的文件中。对于编译器来说,这没什么区别。

6

将多个类写入单个文件并没有问题。这只涉及到维护风格的问题。


5
通常情况下,只有在以下两种情况下才应该将多个类放在同一个文件中:
  1. 这些类之间关联非常紧密。例如,如果一个类定义了自己的迭代器,那么将该迭代器类放在用于迭代的类的同一个文件中可能是合适的。

  2. 其中一个类是供公共使用的,而其余的类用于实现它。例如,在使用“pimpl”惯用语时,公共类仅包含指向私有类的指针。在这种情况下,将私有/隐藏类放在与使用它们的公共类相对应的源文件中可能是合适的。

在这两种情况下,是否将“公共助手”(例如迭代器)和“私有助手”(例如pimpl)类放在同一个源文件或不同的源文件中,应该为整个项目做出一次决定,并且始终遵循该决策。


我喜欢你的回答,因为你解释了一些使用情况,在这些情况下做某事是有争议的。我完全同意迭代器的例子。我查找这个问题的原因是因为我正在为我的应用程序首选项制作一个Qt选项卡对话框窗口,我需要一个窗口类和选项卡类。我正在考虑是否将选项卡拆分成文件,但我在文件结构中没有真正的位置。 - Lightbulb1
对于问题#2,使用d-pointer也有助于维护ABI。 - Louis Go

3

是的,你可以。这必须得到支持,否则你将无法创建嵌套类。

class outside
{
public:
      class nested
      {
      public:
            static int x;
            static int y;
            int f();
            int g();
      };
};

3

只是可扩展性/可维护性问题;) 没有严格的规定。


6
如果这个学校项目存在可扩展性问题,那么Chad需要为自己的工作谈判薪资;-) - Carl Seleborg

2

在C++中,您可以在单个文件中定义多个类。这样做不会导致任何问题。


你能详细解释一下“你不会遇到麻烦”吗?你的回答与其他人的相反。 - Cloud Cho
你可以定义任意数量的类。语言会允许你这样做。是否这样做取决于你和你的目标。 - arhuaco

2

在单个文件中定义多个类不会有任何问题。

这对于生产系统来说并不是特别好的实践,但对于作业来说这并不是问题。


请详细说明“您不会有任何问题”这句话的意思?因为您的回答与其他人的回答相反。 - Cloud Cho

2
这个问题来自于Java/C#风格的源代码表示。在C++中,源代码布局非常不同。一个源单元/"cpp文件"/可以处理尽可能多的声明。然而,这并不一定是一个好策略,因为在某些时候,你需要告诉其他类如何处理你的类。在C++中,一个类可以有一个分离的定义和声明部分,并且你可以将它们放在不同的文件中。类的定义通过#include语句在其他源文件之间共享,因此你可以在任何需要该定义的场景中使用这些类。如果你正在处理仅在一个源文件中使用的类,你可以将其隐藏在源文件中,但如果你想将它们连接到其他类,你需要将定义放在头文件中。
这可以帮助你提高编译速度 - 尤其是如果你使用预编译头文件,但要小心,因为pch-s不是C++标准的一部分,每个编译器都以不同的方式处理它们! - 和你的代码的灵活性。你的老师应该意识到这些事实...

你把定义和声明的概念颠倒了。 - greta

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接