c ++中的多个定义错误和解决此问题的解决方案

sta*_*k92 5 c++ compiler-errors multiple-definition-error linkage

我是C++的新手.我对C++中的多个定义错误有些怀疑.

假设我在一个程序中有3个文件.一个头文件和两个.cpp文件.我已将头文件包含在.cpp文件中.

  1. 我在头文件中声明了一个类,并且我以完全相同的方式在每个.cpp文件中定义了类.那么这种类型的实现会导致多个定义错误吗?如果是这样,是因为它有两个类定义副本,编译器在链接两个.o文件时不知道要采用哪一个?

我们可以通过extern在头文件中使用并仅在一个文件中定义类来解决这个问题吗?如果我们可以通过使用此方法解决问题,我们是否必须将.cpp(带有类定义)包含到其他.cpp文件中(没有课程定义)?

  1. 我在头文件中声明并定义了一个类.这种情况是否与上述相同(1中提到)?

  2. 我在头文件中声明了一个类,我在每个.cpp文件中定义了类,但定义(函数体)不同.那么这种类型的实现会导致多个定义错误吗?如果是这样,我们如何解决.cpp文件中函数体不同的问题?

joh*_*ohn 9

1)您可以通过仅在一个cpp文件中"定义类"来解决此问题.为什么要在两个文件中定义它?

2)不要在头文件中定义东西,只声明它们.此规则有例外,例如内联函数.类本身也可以定义不止一次(我的意思是声明类的方法和数据成员,(即写class XYZ { ... };)但每个定义必须相同.实现这一点的最简单方法是在头文件中定义一次类然后,在多个位置包含该头文件所产生的每个定义必然是相同的.

3)这个更加愚蠢,两次定义一些东西是一回事,但是定义两次并且不同地每次定义更少.

我想这个问题就是为什么你认为有时可能需要不止一次定义东西.不要那样做.

您还应该通过"定义类"来明确您的意思.我认为这意味着定义类的方法和静态成员.但如果你有其他想法可能会引起混乱.像往常一样,避免这种术语混淆的最好方法是发布一些代码.


Age*_*ien 6

要回答所有这些问题,您只需查看声明和定义的目的。

类的声明只是声明该类存在以及在哪个上下文中。对于一个类,一个简单的前向声明(例如class Banana;)允许您使用该类的指针或引用,但仅此而已。

定义准确地说明了类是什么。也就是说,它具有哪些成员以及它从哪些基类派生。每当您访问类的成员或需要知道其实例的大小时,您都需要它。这意味着类定义需要放在头文件中,以便它可以包含在使用该类的所有文件中的任何位置。这是可以的,因为标准说一个类可以在多个翻译单元中定义,只要所有定义都相同。

类定义通常如下所示:

class Banana
{
public: 
  Banana(){}

  void eat();

private:
  //....
};
Run Code Online (Sandbox Code Playgroud)

但是请注意,这个类定义仅指类本身的定义,而不是非内联成员函数。比如void eat()上面的例子。这些需要在 .cpp 文件中定义,因为它们可能不会在多个翻译单元中定义。

简而言之:

  1. 这是不对的,只能在头文件中定义,并在匹配的.cpp文件中定义非内联成员函数。永远不要在多个文件中定义相同的函数或类型。
  2. 这没问题,只要您在 .cpp 文件中单独定义成员函数即可。
  3. 不,见 1。