我有一个用C++编写的功课来编写一所大学.我有两个主要的抽象类学生和课程.在课程中,有不同的子课程,如SoftwareEngineering课程等.在学生中,有不同的子课程,如SoftwareEngineering学生课程等.
现在,在课程子课程中,每个子课程都具有注册学生的功能
void register(Student &s);
Run Code Online (Sandbox Code Playgroud)
当我调用每个课程子类的函数寄存器(例如软件工程课程类)时,我想将该学生引用推送到向量中.但是我得到了错误
cannot allocate an object of abstract type 'Student'
Run Code Online (Sandbox Code Playgroud)
Student类是抽象的,并且有子类SoftwareEngineeringStudent等.但我 - 必须让寄存器功能得到一个抽象对象学生,而不是像SoftwareEngineeringStudent那样的特定类型的学生.
有可能解决这个问题吗?
这是一个骨架(当然不是完整的代码!):
//Course.h
class Course{
virtual void reg(Student &s)=0
}
class SoftwareEngCourse : public Course{
void reg(Student &s);
}
//Student.h
class Student{
virtual void study(Course &c)=0;
}
class SoftwareEngStudent : public Student{
void study(Course &c);
}
Run Code Online (Sandbox Code Playgroud)
现在在Course.cpp中:
//Course.cpp
void SoftwareEngCourse::reg(Student &s){
vector_of_Student_object.push_back(s);
}
Run Code Online (Sandbox Code Playgroud)
在评论中你说你的向量被声明为:
std::vector<Student> vector_of_Student_object;
Run Code Online (Sandbox Code Playgroud)
......这就是问题所在.您试图在其中存储Student对象vector,但您无法存储Student对象,因为该类是抽象的.考虑以下psudocode:
void foo(Student s)
{
}
int main()
{
SoftwareStudent ss;
foo(ss);
}
Run Code Online (Sandbox Code Playgroud)
什么ss时候foo被召唤?你正在通过SoftwareStudent,但foo只需要一个Student.所以ss隐式转换为它的基类,Student因为foo它取一个Studentby值,试图Student通过调用构造一个new :
Student::Student(const Student& rhs)
Run Code Online (Sandbox Code Playgroud)
换句话说,
你的SoftwareStudent特定属性ss可能没有自己实现这个构造函数,在这种情况下编译器为你做了.
最终结果是您尝试实例化一个抽象类,因为foo它采用了一个Studentby-value.这显然不起作用,因为您无法实例化抽象类.
这涉及到你的实际问题,因为你vector是一个vector的Student对象,通过数值再次存储.将对象插入向量时,将复制该对象.你最终试图实例化Student对象,你不能这样做,因为它Student是抽象的.
你需要比其他店铺的东西Student,无论是Student引用或指针.由于你不能有一个vector引用,这会留给你指针.
每当处理指针时,最好处理智能指针而不是原始指针,就像智能指针一样,你不需要担心释放对象,而且通常你甚至不必new明确地使用它. std::shared_ptr这可能是最容易融入的,尽管std::unique_ptr在语义上可能更合适.