2

所以我做了一个复杂的项目,现在我有太多的包含文件让我很头疼。我怎样才能最好地管理这些课程?有些类需要使用其他类。我还有一个 .h 文件,其中包含一堆 int 数组。这些在应用程序中保持不变,但是当编译器抱怨我正在重新定义数组时,我遇到了问题。

我应该做一个类库吗?命名空间?动态链接库?最佳做法是什么?我在哪里可以找到正确的做法?

4

3 回答 3

11

文件.h

   #ifndef FILE_H_INCLUDED
   #define FILE_H_INCLUDED

   void foo();

   #endif
  • 尽可能避免使用全局变量。如果必须使用它们,请使用声明全局变量extern并将定义放在.cpp文件中。

文件.h

   extern int var[20];

文件.cpp

   int var[20];
  • 如果可能,请使用前向声明。只要您只使用一个类的引用或一个指针并且不取消引用该指针,就可以使用前向声明。

有用的.h

   class Useful {};

其他.h

   // Forward-declare instead of #include
   class Useful;

   class Other
   {
       Useful* helper;
   };
于 2012-12-27T22:21:58.797 回答
1

我不认为真的有最佳实践,这取决于情况。我可能会建议将类似对象分组到命名空间中,然后将所有定义放在一个 .h 文件中。如果实现很短,请将它们全部放在一个 cpp 文件中。在我的工作中,我们有一个像这样的数据库访问层。大约有几十个对象由存储的过程填充。该代码仍然是一个主要的痛苦,但它比拥有两个少于 500 行的 .h 和 cpp 文件要好。如果你这样做,将对象定义区分开来的注释变得非常重要。您可以轻松获得超过 10,000 行的文件,因此您需要一些东西来分解它们。

当然使用包括警卫,他们可能会解决重新定义的错误。

于 2012-12-27T22:25:08.733 回答
0

您需要知道定义和声明之间的区别,以及实体的哪些用途需要声明实体。然后你还需要学习“一个定义规则”(ODR),它告诉你什么时候不允许在程序中有多个定义(因此定义不能放在标题中)以及什么事情只要定义相同,就可以多次定义(因此定义可以放在标题中)。

例如,您要声明的那些数组;由于这些是全局可见的数组,程序只能包含一个定义,因此该定义不能放在标题中。需要访问它们的程序的每个部分只需要知道它们的声明。因此,不要将定义放在头文件中并违反 ODR,而应该有一个包含其定义的 C++ 文件和一个包含它们的声明的头文件。

像这样的代码:

int foo[100];

都声明并定义了数组foo。将这样的代码放入 C++ 文件中。要仅声明此数组,请执行以下操作:

extern int foo[100];

将这样的代码放在标题中。

类定义、内联函数和模板都是可以多次定义的,只要定义相同。您可以将这些定义放在头文件中,而常规函数和全局变量只能定义一次,因此您在头文件中声明它们,然后在实现文件中定义它们。

于 2012-12-27T22:50:52.357 回答