0

我目前有一个抽象的用户类和一个从用户继承的学生类。我正在尝试从 main 初始化 Student 类的实例。我收到此错误

架构 i386 的未定义符号:“Student::Student()”,引用自:ccJo7npg.o 中的 _main “Student::~Student()”,引用自:ccJo7npg.o 中的 _main 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;
}
};

主要.cpp:

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

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

我正在使用带有“ g++ User.cpp Student.cpp main.cpp ”的 g++ 进行编译

谢谢!

4

1 回答 1

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 保护,正如 Kevin Grant 解释的那样。您将以相同的方式对待 User.cpp 和 User.h。

于 2012-07-15T06:06:26.413 回答