2012-07-15 119 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。

相关问题