1

私は大学をプログラムするためにC++で宿題をしています。私は2つの主要な抽象クラスStudentとCourseを持っています。コースには、SoftwareEngineeringクラスなどのさまざまな子クラスがあります。Studentには、SoftwareEngineering学生クラスなどのさまざまな子クラスがあります。

現在、コースの子クラスでは、各子クラスに学生を登録する機能があります

void register(Student &s);

各コースの子クラス(ソフトウェアエンジニアリングコースクラスなど)の機能レジスタを呼び出すとき、その学生の参照をベクトルにプッシュしたいと思います。しかし、私はエラーを受け取ります

 cannot allocate an object of abstract type 'Student'

Studentクラスは抽象クラスであり、SoftwareEngineeringStudentなどの子クラスがあります。しかし、私は、register関数に、SoftwareEngineeringStudentのような特定のタイプの学生ではなく、抽象オブジェクトStudentを取得させる必要があります。

これを回避する方法はありますか?

これがスケルトンです(もちろん、完全なコードではありません!):

//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);
}

現在Course.cppにあります:

//Course.cpp
void SoftwareEngCourse::reg(Student &s){
   vector_of_Student_object.push_back(s);
}
4

2 に答える 2

5

コメントで、あなたはあなたのベクトルが次のように宣言されていると言いました:

std::vector<Student> vector_of_Student_object;

...そしてそこに問題があります。Studentオブジェクトをに格納しようとしていますが、そのクラスが抽象であるためvector、オブジェクトを格納できません。Student次の擬似コードを検討してください。

void foo(Student s)
{
}

int main()
{
  SoftwareStudent ss;
  foo(ss);
}

と呼ばれるとどうなりssますか?fooあなたはを渡していますがSoftwareStudentfooただ取るだけStudentです。したがってss、暗黙的にその基本クラスに変換されます。基本クラスは、値Studentによって取得されるため、次の呼び出しによって新しいものを構築しようとします。fooStudentStudent

Student::Student(const Student& rhs)

つまり、YouのSoftwareStudent-specific属性はss 、このコンストラクターを自分で実装していない可能性があります。その場合、コンパイラーが実装します。

foo最終的には、値による値を取るため、抽象クラスをインスタンス化しようとしていますStudent。抽象クラスをインスタンス化できないため、これは明らかに機能しません。

これは実際の問題に関連しています。これvectorは、vectorStudentオブジェクトであり、値によって再度格納されるためです。オブジェクトをベクトルに挿入すると、そのオブジェクトがコピーされます。オブジェクトをインスタンス化しようとすることになりますが、これは抽象的でStudentあるため実行できません。Student

Student参照またはStudentポインタ以外のものを格納する必要があります。あなたは参照を持つことができないのでvector、それはあなたにポインタを残します。

newポインタを扱うときはいつでも、オブジェクトの解放についてそれほど心配する必要がなく、明示的 に使用する必要さえないスマートポインタのように、生のポインタではなくスマートポインタを扱うのが最善です。意味的にはより適しているかもしれませんがstd::shared_ptr、おそらくここに組み込むのが最も簡単です。std::unique_ptr

于 2012-11-13T14:37:59.387 に答える
3

はい、vector_of_Student_object代わりに学生への(スマート)ポインタのベクトルを作成します。

オブジェクトはスライスされるため、オブジェクトのベクトルはおそらくあなたが望むものではありません。

于 2012-11-13T13:57:40.967 に答える