我目前有一个抽象的User类和一个继承自user的Student类。我正在尝试从main初始化Student类的实例。我收到此错误
架构i386的未定义符号: “Student :: Student()”,引自: _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”
谢谢!
答案 0 :(得分:3)
GCC不会为Student构造函数和析构函数生成代码,因为它们是在类声明中定义的。这就是为什么这些符号丢失并产生链接错误的原因。至少,您需要在类声明之外移动Student构造函数和析构函数的函数体,并在定义中仅提供签名(无正文):
class Student: public User
{
Student();
~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;
}
如果你这样做,你将需要.h文件中的#ifndef警卫,正如凯文格兰特解释的那样。 你会以同样的方式对待User.cpp和User.h。