1

純粋な仮想クラスから継承しようとしているときに、「息子」クラスのコンストラクターを作成すると、次のエラーが表示されます。

../src/Course.cpp:54:77: error: class ‘ElectiveCourse’ does not have any field named ‘_dptr’

これはすべてのコース保護フィールドで発生します。

これは構造です:

Course.h:

    class Course{
    public:
        virtual void reg(Student * s) = 0;
    ..
    protected:
    ...
        string _dptr;
    ...
    };

その後:

class ElectiveCourse : public Course{
...
}

Course.cpp:

ElectiveCourse::ElectiveCourse(
    string name,
    int semester,
    double minGrade
)
: _dptr("CS"), _name(name), _semester(semester), _minGrade(minGrade) {
}

ElectiveCourse と同様に、Course クラスから継承する他の 2 つのクラスがあり、それらすべてで同じエラーが発生します。[編集] これは、それらのコンストラクターでのみ発生します。Course クラスにはコンストラクターがないため、純粋な仮想です。

一方、Student と CSStudent : Student の 2 つのクラスもあります。ここで、Student も純粋な仮想であり、CSStudent は Student を継承します。この場合、エラーは発生しません。私はそれらの両方でまったく同じことをしました。問題に見えるのは?文法エラーで申し訳ありません。

[編集] エラーが発生している Course.cpp 部分を追加しました。

ありがとう!

4

2 に答える 2

3

サブクラスコンストラクターで親クラスのフィールドを初期化することはできません。その理由は、実際にその内部フィールドに対処する前に、構築順序に基本クラスの構築が含まれているためです。そして、基地の建設には、その内部フィールドの建設が必要です。とはいえ、必要なものを実現するには、基本クラスにすべてのパラメーター(名前、学期など)を受け入れるコンストラクターを作成し、サブクラスコンストラクターからこのコンストラクターを呼び出す必要があります。

Course::Course(string name, 
               int semester,
               double minGrade):
               _dptr("CS"), 
               _name(name),
               _semester(semester),
               _minGrade(minGrade){}

ElectiveCourse::ElectiveCourse(string name,
                               int semester,
                               double minGrade):
                               Course(name, semester, minGrade){}
于 2012-11-18T08:54:46.423 に答える
3

あるクラスのメンバー変数を別のクラスで初期化することはできません。コンストラクターで Course のメンバー変数を初期化する場合は、Course にコンストラクターを追加する必要があります。必要に応じて、そのコンストラクターを保護することができます。

別の方法 (おそらくより良い方法) は、デザインを変更して Course をインターフェイスにすることです。

于 2012-11-18T08:52:32.820 に答える