父类的字段无法识别
Posted
技术标签:
【中文标题】父类的字段无法识别【英文标题】:Fields of Parent Class not recognized 【发布时间】:2012-11-18 08:39:34 【问题描述】:我遇到问题已经有一段时间了,当我尝试从纯虚拟类继承时,当我为“子”类创建构造函数时收到此错误:
../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 部分。
谢谢!
【问题讨论】:
贴出真实的相关代码。并纠正你的拼写 “Course 类中没有构造函数,因此它是纯虚拟的。”为什么纯虚拟类不应该有构造函数?纯虚拟只是意味着您必须按顺序从该类派生,然后才能从中创建对象——但是,这些对象的“基础”部分仍然需要构造,为此可能需要构造函数。 顺便说一句,在 C++ 中,每个类都有一个构造函数。如果您没有显式声明一个,编译器会添加一个默认构造函数。您唯一能做的就是通过声明构造函数受保护或私有来限制从外部对构造函数的访问。所以你的“纯虚拟”类确实有一个构造函数(默认生成的),甚至是一个公共的! 【参考方案1】:您不能在另一个类中初始化一个类的成员变量。如果要在构造函数中初始化 Course 的成员变量,则必须在 Course 中添加构造函数。如果您愿意,您可以保护该构造函数。
另一种选择(可能更好)是更改您的设计以使课程成为界面。
【讨论】:
【参考方案2】:您不能在子类构造函数中初始化父类的字段。原因是构造顺序包括基类的构造,然后才能实际处理其内部字段。而基地的建设需要建设其内部领域。也就是说,为了实现你所需要的,你应该在你的基类中创建一个构造函数,它接受你的所有参数(姓名、学期等)并从你的子类构造函数中调用这个构造函数:
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)
【讨论】:
以上是关于父类的字段无法识别的主要内容,如果未能解决你的问题,请参考以下文章
PHPStorm 无法识别 Laravel 5.0 中我的 Model 类的方法 [重复]