C++;功能失效 我的C++程序失败了,原因如下: Error 1 error LNK2005: "public: void __thiscall dataHolder::addData(int)" (?addData@dataHolder@@QAEXH@Z) already defined in Source.obj Error 2 error LNK2005: "public: void __thiscall dataHolder::findUnique(void)" (?findUnique@dataHolder@@QAEXXZ) already defined in Source.obj Error 3 error LNK2005: "public: void __thiscall dataHolder::printData(void)" (?printData@dataHolder@@QAEXXZ) already defined in Source.obj Error 4 error LNK1169: one or more multiply defined symbols found 但是,当我在一次源C++文件中移动所有定义时,它工作得很好。
下面是我的源代码: source.cpp文件:C++;功能失效 我的C++程序失败了,原因如下: Error 1 error LNK2005: "public: void __thiscall dataHolder::addData(int)" (?addData@dataHolder@@QAEXH@Z) already defined in Source.obj Error 2 error LNK2005: "public: void __thiscall dataHolder::findUnique(void)" (?findUnique@dataHolder@@QAEXXZ) already defined in Source.obj Error 3 error LNK2005: "public: void __thiscall dataHolder::printData(void)" (?printData@dataHolder@@QAEXXZ) already defined in Source.obj Error 4 error LNK1169: one or more multiply defined symbols found 但是,当我在一次源C++文件中移动所有定义时,它工作得很好。,c++,C++,下面是我的源代码: source.cpp文件: #include "dataClass.h" void main(){ dataHolder v1; for(int i=1;i<=10;i++) v1.addData(i); for(int i=1;i<=5;i++) v1.addData(i); v1.printData(); v1.findUnique(); } #包括“dataClass.h” void mai
#include "dataClass.h"
void main(){
dataHolder v1;
for(int i=1;i<=10;i++)
v1.addData(i);
for(int i=1;i<=5;i++)
v1.addData(i);
v1.printData();
v1.findUnique();
}
#包括“dataClass.h”
void main(){
数据持有者v1;
对于(int i=1;i将类方法的实现移动到cpp文件(而不是头文件)中。这样,它们不会被多次包含。将类方法的实现移动到cpp文件(而不是头文件)中。这样,它们就不会被多次包含。您只需将类成员实现移动到.cpp文件中即可。例如dataClass.cpp:
#include "dataClass.h"
void dataHolder::addData(int val){
dataVector.push_back(val);
};
void dataHolder::printData(){
vector<int>::iterator vIt;
for(vIt=dataVector.begin();vIt<dataVector.end();vIt++){
cout<< *vIt<<endl;
};
};
void dataHolder::findUnique(){
map<int ,int> dataMap;
vector<int>::iterator vIt;
map<int ,int>::iterator mIt;
for(vIt=dataVector.begin();vIt<dataVector.end();vIt++){
if(dataMap.find(*vIt)==dataMap.end())
dataMap[*vIt]=1;
else
dataMap[*vIt] = dataMap[*vIt]+1;
};
for(mIt=dataMap.begin();mIt != dataMap.end();mIt++){
if(mIt -> second == 1)
cout<<mIt->first<<" is Unique"<<endl;
};
};
#包括“dataClass.h”
void dataHolder::addData(int val){
数据向量。推回(val);
};
void dataHolder::printData(){
向量::迭代器vIt;
对于(vIt=dataVector.begin();vIt您只需将类成员实现移动到.cpp文件中即可。例如dataClass.cpp:
#include "dataClass.h"
void dataHolder::addData(int val){
dataVector.push_back(val);
};
void dataHolder::printData(){
vector<int>::iterator vIt;
for(vIt=dataVector.begin();vIt<dataVector.end();vIt++){
cout<< *vIt<<endl;
};
};
void dataHolder::findUnique(){
map<int ,int> dataMap;
vector<int>::iterator vIt;
map<int ,int>::iterator mIt;
for(vIt=dataVector.begin();vIt<dataVector.end();vIt++){
if(dataMap.find(*vIt)==dataMap.end())
dataMap[*vIt]=1;
else
dataMap[*vIt] = dataMap[*vIt]+1;
};
for(mIt=dataMap.begin();mIt != dataMap.end();mIt++){
if(mIt -> second == 1)
cout<<mIt->first<<" is Unique"<<endl;
};
};
#包括“dataClass.h”
void dataHolder::addData(int val){
数据向量。推回(val);
};
void dataHolder::printData(){
向量::迭代器vIt;
对于(vIt=dataVector.begin();vIt而言,问题在于您在头文件中定义了dataHolder
成员函数。这意味着包括头文件在内的每个源文件都有这些成员函数的定义
您可以这样做,但是您必须将它们标记为内联
,或者可能标记为静态
您应该做的是创建另一个源文件,其中包含成员函数定义,并将该源文件包含在项目中,以便对其进行编译和链接。问题在于您在头文件中定义了数据持有者
成员函数。这意味着包括头文件在内的每个源文件都将具有e这些成员函数的定义
您可以这样做,但是您必须将它们标记为内联
,或者可能标记为静态
您应该做的是创建另一个源文件,其中包含成员函数定义,并将该源文件包含在项目中,以便对其进行编译和链接。您还可以使用头保护来确保头文件只加载一次
#ifndef _DATA_CLASS_H_
#define _DATA_CLASS_H_
#include <...>
class dataHolder {
...
}
/* Function Definitions */
#endif /* _DATA_CLASS_H_ */
\ifndef\u数据\u类\u H_
#定义数据类_
#包括
类数据持有者{
...
}
/*函数定义*/
#endif/*\数据\u类\u H\u*/
请参阅此问题:您还可以使用头文件保护来确保头文件只加载一次
#ifndef _DATA_CLASS_H_
#define _DATA_CLASS_H_
#include <...>
class dataHolder {
...
}
/* Function Definitions */
#endif /* _DATA_CLASS_H_ */
\ifndef\u数据\u类\u H_
#定义数据类_
#包括
类数据持有者{
...
}
/*函数定义*/
#endif/*\数据\u类\u H\u*/
参见这个问题:
无关的提示:一般来说,你应该避免在头文件中使用指令。<代码>但是,当我在一次源C++文件中移动所有定义时,它工作得很好。< /代码>为什么不这样做?无关的提示:一般来说,你应该避免在头文件中使用指令。<代码>但是,当我在一次源C++文件中移动所有定义,它工作得很好。< /代码>为什么不这样做呢?