下面是两个文件,一个包含主函数,另一个包含h文件。
main
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){}
};当我试图编译这两个文件时,我会得到一个错误
error: redefinition of ‘class issuesofRelevance’
class issuesofRelevance{我不知道为什么会发生这种事
发布于 2020-05-22 10:28:45
假设主函数在main.cpp中,类在IssuesofRelevance.h中。您没有提到是否将.h文件包括在.cpp文件中。但我想是你干的。所以我假设你写了
#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
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);
}发布于 2020-05-22 10:28:53
将类和您想要的相关代码放在一个头文件中(.h扩展名,并且可以通过Visual等编辑器在工作区中轻松地配置),并在需要时使用#include"filename.h"调用它。
请注意,头文件基本上是粘贴到源文件中的代码块,因此如果它们包含相同函数的不同定义或为您的情况说类,它将导致歧义并引发错误--这是类issueofRelevance的情况。
相应的编译和链接错误:
如果您将两个相同的类定义一起写入一个文件中,那么由于编译器检测到的歧义,它会抛出一个错误,因为它只存在于单个文件中。
但是,当您将这两个相同的定义放在不同的文件中并将它们导入到您的cpp文件两次(或者说您将它们导入到另一个cpp文件中并构建解决方案,就像在visual中一样),它会抛出一个链接器错误,因为涉及到链接器(多个文件--其中链接器的工作是将它们链接到一个组合的可执行文件中),并且它不能选择不同文件中存在的多个定义。
如果您处理函数,那么解决问题的解决方案就是使函数保持静态,以便在内部或仅针对正在编译的文件定义函数。这样就可以在不同的文件中对同一个函数进行多个函数定义,而不会出现链接错误。另一种选择是让它保持一致。
发布于 2020-05-22 10:30:00
您已经定义了类issuesofRelevance两次,因此您得到了编译错误。最好将类定义在一个头文件中,并将其包含在其他CPP文件中。我已经修复了你的代码,它是在线主机:
https://www.onlinegdb.com/ByuyF7BsL
似乎你是c++的新手,建议你读一些像c++入门之类的书
https://stackoverflow.com/questions/61952780
复制相似问题