没有名为 [重复] 的字段
Posted
技术标签:
【中文标题】没有名为 [重复] 的字段【英文标题】:does not have field named [duplicate] 【发布时间】:2013-11-11 23:54:48 【问题描述】:我在用两种不同的方法初始化继承类中的成员数据时出现了一个我无法理解的错误,我认为它们在理论上应该是相同的。
class gSolObject
public:
gSolObject();
virtual ~gSolObject()
bool isCollisionObject;
;
class gPlanetObject : public gSolObject
public:
gPlanetObject();
~gPlanetObject();
;
gSolObject::gSolObject():isCollisionObject(1)
gPlanetObject::gPlanetObject():gSolObject(),isCollisionObject(0)
我得到一个错误类'gPlanetObject'没有任何名为'isCollisionObject'的字段。
但是,当我将初始化直接放入构造函数的括号 .. 中时:
gPlanetObject::gPlanetObject():gSolObject()
isCollisionObject=0;
它编译得很好。为什么会这样?
编辑:这也不起作用
gPlanetObject::gPlanetObject():gSolObject(),gSolObject::isCollisionObject(0)
它在'('令牌'之前写'预期的类名
【问题讨论】:
我不认为是重复的?我的类构造函数是显式的?class gPlanetObject : public gSolObject
, gPlanetObject::gPlanetObject():gSolObject(),isCollisionObject(0)
。您正在尝试初始化作为父类成员的“isCollisionObject”。
您正在尝试在派生类gPlanetObject
的构造函数中初始化gSolObject::isCollisionObject
。阅读链接的答案。
哦,好的。我不喜欢那个基类构造函数..它看起来很尴尬..在另一个帖子中重新分配被提到是有问题的。这是为什么呢?
这就是您在上面显示为“编译良好”的解决方案 (isCollisionObject = 0;
)
【参考方案1】:
不能初始化基类中声明的成员变量,因为基类构造函数已经初始化了它们。所有基类构造函数都在成员构造函数之前执行。
您可以重新分配它。或者您可以调用一个基类构造函数,该构造函数接受一个参数并使用该值初始化其成员。
【讨论】:
我在上面的重复帖子中读到重新分配不是好的做法.. 为什么会这样? 好的,我决定重新分配,因为没有人知道为什么这是不好的做法……我对此很满意。谢谢 @user2856452:有理由更喜欢 ctor-initializer 列表。主要用于const
对象,无法分配,以及默认构造某些类型的费用,不适用于bool
。
很高兴知道.. 我有很多派生类,它们采用与基类不同的布尔初始化。重新分配将是地狱。此外,我发现很难阅读 ctor 初始化列表,我会迷失在派生类中的几个初始化。【参考方案2】:
已编辑:您不能调用未初始化对象的方法(此处为 gSolObject
),这就是在构造函数中执行 isCollisionObject(0)
时它起作用的原因。此外,如果您始终将其设置为 0,那么您应该在 gSolObject 构造函数中使用默认值。
【讨论】:
还是不行。现在它在 '(' token| 之前写入预期的类名 这里没有方法,在构造函数体中写isCollisionObject(0)
是行不通的。以上是关于没有名为 [重复] 的字段的主要内容,如果未能解决你的问题,请参考以下文章
在 Power BI 中使用 BigQuery 重复/嵌套字段