首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++为什么我会收到类的错误重新定义?

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

Stack Overflow用户
提问于 2020-05-22 10:18:23
回答 3查看 732关注 0票数 0

下面是两个文件,一个包含主函数,另一个包含h文件。

main

代码语言:javascript
复制
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档案

代码语言:javascript
复制
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){}

};

当我试图编译这两个文件时,我会得到一个错误

代码语言:javascript
复制
 error: redefinition of ‘class issuesofRelevance’
 class issuesofRelevance{

我不知道为什么会发生这种事

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2020-05-22 10:28:45

假设主函数在main.cpp中,类在IssuesofRelevance.h中。您没有提到是否将.h文件包括在.cpp文件中。但我想是你干的。所以我假设你写了

代码语言:javascript
复制
#include "IssuesofRelevance.h"

在main.cpp函数的顶部。现在,#include指令所做的事情是,它接受包含的文件的内容,并将其复制到main.cpp文件中。现在您可以看到,IssuesofRelevance.h文件中有一个类声明,它是粘贴在main.cpp中的副本。另外,在main.cpp文件中也有相同的声明。所以编译器看到您声明了两个名称相同的类。这是不允许的。

因此,如果这两个类是相同的,那么将main.cpp中的一个类剪切到IssuesofRelevance.h中,然后在main.cpp中包含.h文件。一切都会好起来的。

不过这样就行了。但是,您可能需要为类提供一个单独的.h文件和.cpp文件。.h文件包含声明。声明意味着类的成员变量和方法签名。.cpp文件将包含方法体。我认为您是在main.cpp文件中编写的定义。您可以通过以下方式进行声明。

issuesofRelevance.h

代码语言:javascript
复制
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

代码语言:javascript
复制
#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);
}
票数 2
EN

Stack Overflow用户

发布于 2020-05-22 10:28:53

将类和您想要的相关代码放在一个头文件中(.h扩展名,并且可以通过Visual等编辑器在工作区中轻松地配置),并在需要时使用#include"filename.h"调用它。

请注意,头文件基本上是粘贴到源文件中的代码块,因此如果它们包含相同函数的不同定义或为您的情况说类,它将导致歧义并引发错误--这是类issueofRelevance的情况。

相应的编译和链接错误:

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

但是,当您将这两个相同的定义放在不同的文件中并将它们导入到您的cpp文件两次(或者说您将它们导入到另一个cpp文件中并构建解决方案,就像在visual中一样),它会抛出一个链接器错误,因为涉及到链接器(多个文件--其中链接器的工作是将它们链接到一个组合的可执行文件中),并且它不能选择不同文件中存在的多个定义。

如果您处理函数,那么解决问题的解决方案就是使函数保持静态,以便在内部或仅针对正在编译的文件定义函数。这样就可以在不同的文件中对同一个函数进行多个函数定义,而不会出现链接错误。另一种选择是让它保持一致。

票数 1
EN

Stack Overflow用户

发布于 2020-05-22 10:30:00

您已经定义了类issuesofRelevance两次,因此您得到了编译错误。最好将类定义在一个头文件中,并将其包含在其他CPP文件中。我已经修复了你的代码,它是在线主机:

https://www.onlinegdb.com/ByuyF7BsL

似乎你是c++的新手,建议你读一些像c++入门之类的书

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61952780

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档