2012-05-17 33 views
1

我做了一個類命名客戶端和定義下面進去client.h:未定義參照在C + +(使用一個單獨的類)錯誤

#ifndef __CLIENT_H__ 
#define __CLIENT_H__ 

#include <string> 

using namespace std; 

class Client { 
public: 
    Client(string n, string p) : name(n), password(p) {logged_in = true;} 
    void set_name(string n, string p) {name=n; password=p; } 
private: 
    string name; 
    string password; 
    bool logged_in; 
}; 

#endif 

然後我繼承一個單件類從客戶端名爲Admin在admin.h:

#ifndef __ADMIN_H__ 
#define __ADMIN_H__ 

#include "client.h" 

using namespace std; 

class Admin : public Client { 
public: 
    static Admin* get_admin(string n, string p) 
    { 
     if (Admin::n == 0) 
      Admin::admin = new Admin(n, p); 
     else 
      Admin::admin->set_name(n, p); 
     return Admin::admin; 
    } 
private: 
    Admin(string n, string p) : Client(n, p) {Admin::n++;} 
    static int n; 
    static Admin* admin; 
}; 

int Admin::n = 0; 

#endif 

這裏是我的main.cpp:

#include <iostream> 
#include <string> 
#include "client.h" 
#include "admin.h" 

using namespace std; 

int main() 
{ 
    Admin* administrator = Admin::get_admin("ghamar", "utcom90"); 
} 

,問題是,當我想要編譯爲主。 CPP使用G ++(G ++ main.cpp中),我收到以下錯誤:

/tmp/cc15VnHc.o: In function `Admin::get_admin(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> >)': 
main.cpp:(.text._ZN5Admin9get_adminESsSs[Admin::get_admin(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> >)]+0x5f): undefined reference to `Admin::admin' 
main.cpp:(.text._ZN5Admin9get_adminESsSs[Admin::get_admin(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> >)]+0xa0): undefined reference to `Admin::admin' 
main.cpp:(.text._ZN5Admin9get_adminESsSs[Admin::get_admin(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> >)]+0xd1): undefined reference to `Admin::admin' 

錯誤的重要組成部分,說:

undefined reference to 'Admin::admin' 

任何人可以幫助我這個?非常感謝您的時間。

回答

2

除了聲明靜態成員在類定義中,您還需要一個源文件來定義他們:

#include "admin.h" 

int Admin::n = 0; 
Admin* Admin::admin = 0; 

你應該從頭部取出的n定義;如果包含來自多個源文件的頭文件,將會導致「多重定義」錯誤。 = 0位是可選的,因爲靜態對象默認爲零初始化。

您還應該從包含防護的開始刪除下劃線;那些保留,並且使用它們可能會導致與標準庫實現使用的名稱發生衝突。

+0

,我不能假設:

刪除的Admin::n從admin.h的定義,並添加以下到一個源文件即Admin :: n = 0;會被定義一次? (多重定義錯誤) – Homie

+1

@Homie。不可以。包含警衛只會阻止文本在單個翻譯單元中出現*。如果您有多個翻譯單元(例如多個.CPP文件),則該定義將出現在每個翻譯單元中。 –

1

您已經聲明admin,但沒有定義它(但你已經定義n):

int Admin::n = 0; 
Admin* Admin::admin; // <-- add this 
1

您需要定義Admin類的外部,因爲它是靜態的。

Admin* Admin::admin = NULL; 
2

這裏有兩個問題,目前只能看到一個錯誤。

您需要在單個源文件中定義Admin::nAdmin::admin。目前,前者是在頭文件中定義的(一旦多個源文件包含該頭文件,將導致多重定義錯誤),而後者根本沒有定義。使用的#ifndef ...#定義... #ENDIF

#include "admin.h" 

int Admin::n = 0; 
Admin* Admin::admin = 0;