2017-09-14 247 views
0

我有一個奇怪的錯誤,當我編譯我的代碼,它說,它確實另一個類中存在的成員函數alreadys不是錯誤說未知函數已經存在錯誤

錯誤LNK2005「市民:無效__thiscall membershipType: :打印(無效)」 在 personType.obj PROJECT1ç已經定義(打印@ @@ membershipType QAEXXZ):\用戶\ okpal \源\回購\ PROJECT1 \ PROJECT1 \ Source.obj

和還

錯誤LNK1169一個或多個多重定義符號 發現PROJECT1 C:\用戶\ okpal \源\回購\ PROJECT1 \調試\ PROJECT1.EXE 1

我想知道如果有人可以幫助找出錯誤 我的類代碼如下

#include <iostream> 
#include <string> 
using namespace std; 
class addressType { //class defintions and prototypes member variables 
public: 
    addressType(); 
    string streetAddressNum, streetName, streetType, city, stateInitials; 
    int zipCode; 
}; 
class personType 
{ 
public: 
    personType(); 
    string firstName; 
    string lastName; 
    int personNum; 
    char gender; 
    int personID; 
    addressType address; 
    void setInterest1(string interest1);//mutator 
    void setInterest2(string interest2); 
    void printPerson(); 
    string GetInterest1() const; // Accessor 
    string GetInterest2() const; 
private: 
    string SetInterest1; 
    string SetInterest2; 
}; 
//define membershipType class 
class membershipType :public personType 
{ 
public: 
    char membership_type; 
    char membership_status; 
    membershipType(); // 1st constructor 
    membershipType(char, char); // 2nd constructor 
    void print(); 

}; 

void membershipType::print() 
{ 
    cout << GetInterest1(); 
} 

爲persontype源代碼

#include "personType.h" 
personType::personType() 
{ 
    int personNum = 0; 
    int personID = 0; 
} 
addressType::addressType() { 
    int zipCode = 0; 
} 
void personType::setInterest1(string interest1) { 
    SetInterest1 = interest1; 
}//mutator 
void personType::setInterest2(string interest2) { 
    SetInterest2 = interest2; 
} 
string personType:: GetInterest1() const 
{ 
    return SetInterest1; 
}// Accessor 
string personType:: GetInterest2() const { 
    return SetInterest2; 
} 

void personType :: printPerson() {//constructor 

    cout << firstName << " " << lastName << " " << gender << " " << 
     personID << " " << address.streetAddressNum << " " 
     << address.streetName << " " << address.streetType 
     << " " << address.city << " " << address.stateInitials 
     << " " << address.zipCode << " " << SetInterest1 << " " << SetInterest2 << endl; 
} 
+2

將'print'的定義移動到實現文件(.cpp) –

+0

好了,終於有效了,我想知道它爲什麼起作用了? –

+2

閱讀[odr](https://en.m.wikipedia.org/wiki/One_Definition_Rule) –

回答

1

你有第一個代碼塊中的membershipType::print()的定義,我認爲這是從頭文件複製的。在C++中,頭文件的內容被插入到包含它們的每個文件中。據推測,你的程序中至少有兩個源文件包含這個頭文件。當這些源文件被編譯爲目標文件時,兩者都將包含一個定義membershipType::print()。當您嘗試鏈接它們時,鏈接程序將檢測到這兩個文件都包含相同符號的定義。它不知道在哪裏使用,所以它返回一個錯誤。

解決此問題的最簡單方法是將membershipType::print()的定義移動到源文件。你也可以通過內聯來修復它。