创建一个类型为“this”/当前对象的指针

时间:2016-04-12 10:15:57

标签: c++ oop pointers c++11 typeid

有没有办法使用'this'关键字或类似关键字创建当前对象类型的指针,以便不明确提及类类型?

我有一个基类GraphicObjects,它可以作为其他GraphicObjects和从GraphicObjects派生的对象的容器。我认为这可能比明确命名类中的类型更好,所以我可以在别处使用它/更改类名。

class GraphiObjects {
  typeid(*this) *a; // Fails.
  GraphicObjects *b; // This works.
  GraphicObjects *children_[];
};

如果可能,有什么理由不使用它吗?

2 个答案:

答案 0 :(得分:1)

C ++是一种编译语言,主要是静态类型系统。特别是,每个表达式都有一个在编译时确定的类型。例如,在GraphiObjects的函数中,this指针的类型为GraphiObjects*,可能添加了const和/或volatile

现在还有“运行时类型”这样的东西,因为C ++是一种OO语言。因为thisGraphiObjects*指针,所以它可以指向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

修改

  1. 并非所有对象都包含其他对象,这些不包含任何内容的节点对象应该是一种类型,我们称之为class Node不包含其他对象对象
  2. 其他对象可能有自己的表达式,但也包含其他对象,这些对象应该是单独的类型,我们称之为class ContainerContainer可以继承自{{1}或者有一个成员Node,它还会包含其他Node s / Node s