1

我遇到了一段时间的问题,当我尝试从纯虚拟类继承时,当我为“儿子”类创建构造函数时,我收到此错误:

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

这发生在所有受课程保护的字段中。

这是结构:

课程.h:

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

接着:

class ElectiveCourse : public Course{
...
}

课程.cpp:

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

像 ElectiveCourse 一样,我还有两个从 Course 类继承的类,并且我在所有这些类中都遇到了相同的错误。[编辑] 这只发生在它们的构造函数中。Course 类中没有构造函数,因此它是纯虚拟的。

另一方面,我也有两个类:Student和CSStudent:Student,其中Student也是纯虚拟的,CSStudent继承Student,在这种情况下没有错误。我对他们两个都做了同样的事情。似乎是什么问题?我很抱歉我的语法错误。

[编辑] 添加了我收到错误的 Course.cpp 部分。

谢谢!

4

2 回答 2

3

您不能在另一个类中初始化一个类的成员变量。如果要在构造函数中初始化 Course 的成员变量,则必须在 Course 中添加构造函数。如果您愿意,可以使该构造函数受到保护。

另一种选择(可能更好)是改变你的设计,使课程成为一个界面。

于 2012-11-18T08:52:32.820 回答
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 回答