C++ 为什么我会收到 class 的错误重新定义?

C++ Why am I recieving the error redefinition of class?

下面是两个文件,一个是主要函数,一个是h文件

主要

class issuesofRelevance{

public:
     vector<string> issues;
     int significance = 0; //initalize 0
     int approach = 0; //initalize 0

     issuesofRelevance() {

     }

     void setStance(vector<string> issues, int significance, int approach){

      std::random_device random_device; 
      std::default_random_engine generator(random_device());
      std::normal_distribution<double> distribution(0,1);

     }

};

h 文件

class  issuesofRelevance
{
  public:
     std::vector<std::string> issues;
     int significance;
     int approach;

     issuesofRelevance(){}

  public:
  void setStance(std::vector<std::string> issues, int significance, int approach){}

};

当我尝试编译这 2 个文件时出现错误

 error: redefinition of ‘class issuesofRelevance’
 class issuesofRelevance{

我不确定为什么会这样

假设主函数在 main.cpp 中,class 在 IssuesofRelevance.h 中。如果您在 .cpp 文件中包含 .h 文件,您没有提及任何内容。但我假设你做到了。所以我假设你写了

#include "IssuesofRelevance.h"

在 main.cpp 函数的顶部。现在,#include 指令的作用是获取包含文件的内容,并将其复制粘贴到 main.cpp 文件中。现在您看到了,您在 IssuesofRelevance.h 文件中有一个 class 声明,它被复制粘贴到 main.cpp 中。此外,您在 main.cpp 文件中有相同的声明。所以编译器看到你正在声明两个具有相同名称的 classes。这是不允许的。

因此,如果两个 class 相同,则将 main.cpp 中的一个剪切到 IssuesofRelevance.h,然后将 .h 文件包含在 [=13= 中].一切都应该没问题。

虽然以这种方式它会起作用。但是,您可能需要单独的 .h 文件和 .cpp 文件用于您的 class。 .h 文件包含声明。声明意味着 class' 成员变量和方法签名。 .cpp 文件将包含方法体。我想你在 main.cpp 文件中写了定义。您可以通过以下方式进行声明。

issuesofRelevance.h

class  issuesofRelevance
{
  public:
     std::vector<std::string> issues;
     int significance;
     int approach;

     issuesofRelevance();

  public:
  void setStance(std::vector<std::string> issues, int significance, int approach);

};

issuesOfRelevance.cpp

#include "issuesofRelevance.h"

issuesofRelevance::issuesofRelevance(){
}

void issuesofRelevance :: setStance(std::vector<std::string> issues, int significance, int approach){
    std::random_device random_device; 
      std::default_random_engine generator(random_device());
      std::normal_distribution<double> distribution(0,1);
}

将您的 class 连同您想要的相关代码放入头文件(.h 扩展名,并且可以通过 Visual Studio 等编辑器在工作区中轻松配置),然后调用它如需要时,使用 #include"filename.h".

请注意,头文件基本上是复制粘贴到源文件中的代码块,因此如果它们包含同一函数的不同定义或针对您的情况说 class,则会导致歧义并抛出错误 - 在这种情况下,您的 class issueofRelevance.

相应的编译和linking错误:

如果您在一个文件中同时写入两个相同的 class 定义,那么由于 编译器 检测到的歧义,它会抛出一个错误,因为它只在一个文件中。

但是当您将这两个相同的定义放在不同的文件中并将它们导入您的 cpp 文件两次(或者说您将它们导入另一个 cpp 文件并像 visual studio) 它会抛出 linker 错误,因为涉及 linker(多个文件 - 其中 link 的作业er 是 link 将它们组合成一个组合的可执行文件)并且它不能 select 多个定义存在于不同的文件中。

如果您处理的是函数,那么解决该问题的解决方案是使函数成为静态函数,以便它们在内部定义或仅针对编译它们的文件定义。这使得可以在不同文件中对同一函数进行多个函数定义,而不会出现 linking 错误。另一种选择是使其在线。

您已经定义了 class issuesofRelevance 两次,因此出现了编译错误。你最好在一个头文件中定义 class ,并从其他 CPP 文件中包含它。 我已经修复了您的代码,它已在线托管:

https://www.onlinegdb.com/ByuyF7BsL

看来你是c++新手,建议多看看c++ primer

之类的书