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
之类的书
下面是两个文件,一个是主要函数,一个是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
之类的书