创建类型为 'this'/当前对象的指针

Create a pointer of type 'this' / current object

本文关键字:对象 指针 this 类型 创建      更新时间:2023-10-16

是否有方法使用'this'关键字或类似关键字创建当前对象类型的指针,从而不显式提及类类型?

我有一个基类GraphicObjects,它可以作为其他GraphicObject和从Graphicobject派生的对象的容器。我认为这可能比在类中显式命名类型要好,这样我就可以在其他地方使用它/更改类名。

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

如果可能的话,有什么理由不使用这个吗?

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

现在还有一种叫做"运行时类型"的东西,因为C++是一种OO语言。因为thisGraphiObjects*指针,所以它既可以指向GraphiObjects对象,也可以指向派生类的对象。typeid支持运行时查询,但您正试图在编译时使用它。

您可以将decltype(*this)与成员函数一起使用,但不能将其用于成员数据。这是有道理的:const方法有一个const限定的this指针,而非const方法没有,但对于数据成员来说,没有办法确定this是否应该是const限定。

有办法创建当前对象类型的指针吗

是的,this。创建一个复制this的成员变量充其量是浪费。

我有一个基础class GraphicObjects,它可以作为其他GraphicObjects和从GraphicObjects派生的对象的容器

请不要这样做。创建对象层次结构,并使用标准容器来包含它们。否则,你的每一个对象,甚至是非基础对象,都包含一个空的children_成员,以及操作它所需的任何其他成员和功能。这是浪费和混乱的。

我认为这可能比在类中显式命名类型要好,这样我就可以在其他地方使用它/更改类名

因为您使用的类都在GraphicObjects层次结构中,所以应该利用polymorphism。您可以使用GraphicObjects*引用该层次结构中的所有对象,检索对象类型就像执行dynamic_cast一样简单。

我在这里写了一个相当广泛的例子来演示polymorphism在容器中的使用:http://ideone.com/XSjMHW

编辑:

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