体系结构x86_64的未定义符号-正在编译继承类
Undefined symbols for architecture x86_64 - Compiling inherited class
我目前有一个抽象的User类和一个继承自User的Student类。我正试图从main初始化Student类的一个实例。我收到这个错误
体系结构i386的未定义符号:"Student::Student()",引用自:_ccJo7npg.o中的main"学生::~Student()",引用自:_ccJo7npg.o中的mainld:找不到体系结构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"编译
谢谢!
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。
- C++ 多级虚拟继承编译问题
- 编译时继承类中的隐式虚拟与显式虚拟
- 在编译时检查未实例化的类模板是否继承自其第一个模板参数
- 继承的构造函数,在 clang++3.9 中编译,在 g++ 7 中失败
- 使用多重继承时出现编译错误
- 为什么下面的代码不会编译(c++中的继承)
- 继承可以用来减少C++中编译代码的大小吗?
- C++ 上的循环依赖和继承编译错误
- 编译器无法编译继承 C++
- 如果对象是堆栈创建的(包括继承的类型),是否可以发出编译错误
- 获取多重继承中基类的编译时常量偏移量
- 可以用参数包编译C 17 lambda继承的编译器
- 为什么 Visual C++无法编译从私有嵌套类继承的友元模板
- C++中的继承和模板:为什么以下一段代码不编译?
- 继承结构的类型转换导致g++编译错误
- 继承受保护的函数和公共变量C++时发生多重继承编译错误
- 钻石继承方案在 G++ 中编译良好,但在 VC++/Eclipse 中产生警告/错误
- C++的多重继承和多重实现编译但崩溃
- 具有继承属性的增强精神解析器 - 简单示例无法编译
- 体系结构x86_64的未定义符号-正在编译继承类