2012-07-15 156 views
0

我目前有一個抽象用戶類和一個繼承自用戶的學生類。我試圖從main初始化Student類的一個實例。我收到此錯誤體系結構x86_64的未定義符號 - 編譯繼承類

爲i386硬件架構未定義的符號: 「學生::學生()」,從引用: _main在ccJo7npg.o 「學生::〜學生()」,從引用: _main中ccJo7npg.o LD:符號(多個)未找到i386硬件架構 collect2:LD返回1個退出狀態

用戶類別:

#include <iostream> 
#import <stdio.h> 
#import <string.h> 
using namespace std; 

class User 
    { 
public: 
    void setName(const string n) 
{ 
    name = n; 
} 
string getName() 
{ 
    return name; 
} 
void setUsername(const string u) 
{ 
    username = u; 
} 
string getUsername() 
{ 
    return username; 
} 
void setPassword(const string p) 
{ 
    password = p; 
} 
string getPassword() 
{ 
    return password; 
} 
void setID(const int ID) 
{ 
    this->ID=ID; 
} 
int getID() 
{ 
    return ID; 
} 
void setClassID(const int cid) 
{ 
    classID=cid; 
} 
int getClassID() 
{ 
    return classID; 
} 
void logOut() 
{ 
    cout<<"you have logged out"<<endl; 
} 
void print() 
{ 
    cout<< "Student : "<< ID << name << " "<< username << " " << password << endl; 
} 
virtual void menu()=0; 
protected: 
    int classID, ID; 
    string name, username, password; 
}; 

學生類別:

#include <iostream> 
#include "User.h" 
using namespace std; 

class Student: public User 
{ 
public: 
Student() 
{ 
    classID=0; 
    ID=0; 
    username=""; 
    name=""; 
    password=""; 
} 
~Student() 
{ 
    cout<<"destructor"<<endl; 
} 
void studyDeck(const int i) 
{ 

} 
void viewScores(const int) 
{ 

} 
void viewScores() 
{ 

} 
virtual void menu() 
{ 
    cout << "Student menu" << endl; 
} 
}; 

Main.cpp的:

#include <iostream> 
#include "User.h" 
#include "Student.h" 
using namespace std; 

int main() 
{ 
    Student s; 
    return 0; 
} 

我與G ++通過 「g ++ User.cpp Student.cpp的main.cpp」

感謝編譯!

+1

你的'User.cpp'和'Student.cpp'文件是什麼?它看起來像所有的定義都在你的頭文件中。學生和用戶是否有空的cpp文件? – dasblinkenlight 2012-07-15 00:45:55

+0

這些是User.cpp和Student.cpp文件。我有一些功能我還沒寫。 – 2012-07-15 02:50:12

+0

嘗試給類用戶一個構造函數。 – johnathon 2012-07-15 03:13:56

回答

2

GCC不爲Student構造函數和析構函數生成代碼,因爲它們是在類聲明內部定義的。這就是爲什麼這些符號丟失併產生鏈接錯誤的原因。至少,你需要移動功能機構的學生構造函數和析構函數的類的聲明外,並提供只是在定義簽名(無正文):

class Student: public User 
{ 
Student(); 
~Student(); 
... 
}; 

您需要定義在學生這些函數體的.cpp類定義後如下:

Student::Student() 
{ 
    classID=0; 
    ID=0; 
    username=""; 
    name=""; 
    password=""; 
} 

Student::~Student() 
{ 
    cout<<"destructor"<<endl; 
} 

雖然它是沒有必要的,你應該單獨其執行函數定義的所有。爲此,您可以省略Student.cpp文件中的類定義;而是在Student.cpp中包含Student.h(即使您沒有發佈Student.h,它看起來是正確的,或者程序不會編譯)。換句話說,「Student.h」將包含「class Student {...};」只有函數簽名和括號內沒有功能團體和「Student.cpp」將包含所有功能的定義,對於機構如:

void Student::menu() 
{ 
    cout << "Student menu" << endl; 
} 

如果你這樣做,你還需要在衛兵的#ifndef 。格文解釋說.h文件。 您將以相同的方式處理User.cpp和User.h。

相關問題