无法分配抽象类型解决方案的对象?

The*_*tMe 1 c++ oop

我有一个用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)

Joh*_*ing 5

在评论中你说你的向量被声明为:

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是一个vectorStudent对象,通过数值再次存储.将对象插入向量时,将复制该对象.你最终试图实例化Student对象,你不能这样做,因为它Student是抽象的.

你需要比其他店铺的东西Student,无论是Student引用或指针.由于你不能有一个vector引用,这会留给你指针.

每当处理指针时,最好处理智能指针而不是原始指针,就像智能​​指针一样,你不需要担心释放对象,而且通常你甚至不必new明确地使用它. std::shared_ptr这可能是最容易融入的,尽管std::unique_ptr在语义上可能更合适.