有没有办法使用'this'关键字或类似关键字创建当前对象类型的指针,以便不明确提及类类型?
我有一个基类GraphicObjects,它可以作为其他GraphicObjects和从GraphicObjects派生的对象的容器。我认为这可能比明确命名类中的类型更好,所以我可以在别处使用它/更改类名。
class GraphiObjects {
typeid(*this) *a; // Fails.
GraphicObjects *b; // This works.
GraphicObjects *children_[];
};
如果可能,有什么理由不使用它吗?
答案 0 :(得分:1)
C ++是一种编译语言,主要是静态类型系统。特别是,每个表达式都有一个在编译时确定的类型。例如,在GraphiObjects
的函数中,this
指针的类型为GraphiObjects*
,可能添加了const
和/或volatile
。
现在还有“运行时类型”这样的东西,因为C ++是一种OO语言。因为this
是GraphiObjects*
指针,所以它可以指向GraphiObjects
对象,但也指向派生类的对象。 typeid
支持运行时查询,但您尝试在编译时使用它。
您可以将decltype(*this)
与成员函数一起使用,但不能将其用于成员数据。这是有道理的:const
方法有一个const限定的this
指针,非const方法没有,但对于数据成员,没有办法确定this
是否应该是const-合格。
答案 1 :(得分:1)
是的,this
。创建复制this
的成员变量充其量是浪费。
class GraphicObjects
,可以作为其他GraphicObjects
的容器和从GraphicObjects
请不要这样做。创建对象层次结构并使用标准容器来包含它们。否则,每个对象,甚至非基础对象都包含空的children_
成员,以及操作它所需的任何其他成员和功能。这是浪费和混乱。
因为您使用的所有课程都在GraphicObjects
'层次结构,你应该利用polymorphisim。您可以使用GraphicObjects*
引用此层次结构中的所有对象。检索对象类型就像执行dynamic_cast
一样简单。
我已经写了一个相当广泛的例子来证明多态性在容器中的使用:http://ideone.com/XSjMHW
修改强>
class Node
,不包含其他对象对象 class Container
,Container
可以继承自{{1}或者有一个成员Node
,它还会包含其他Node
s / Node
s