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++程序失败了,原因如下: 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

下面是我的源代码:

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 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++文件中移动所有定义,它工作得很好。< /代码>为什么不这样做呢?