2016-04-12 52 views
1

是否有一种方法可以使用'this'关键字或类似的方法创建当前对象类型的指针,以便不明确提及类类型?创建一个类型为'this'/当前对象的指针

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

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

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

+5

你想实现什么? 'typeid'返回一个'std :: type_info' *对象*。你有没有把它与C++ 11的['decltype'](http://en.cppreference.com/w/cpp/language/decltype)混淆?类似于'typename std :: remove_reference :: type a;'在* methods *中完全有效,但是...好吧... – dhke

+0

模板可能能够拯救你,但为什么它不仅可以编写'Alpha *'?如果这只是一个问题或偏好,那么我会说“这是语言的一部分,不要绕过它”。 – MicroVirus

+0

@Michael我有一个基类GraphicObjects,它可以充当其他GraphicObjects和派生自GraphicObjects的对象的容器。我认为这可能比明确指定类中的类型要好,所以我可以在别处使用它/更改类名。 –

回答

1

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

现在还有类似“运行时类型”的事情,因为C++是OO语言。由于thisGraphiObjects*指针,因此它可以指向GraphiObjects对象,但也可指向派生类的对象。 typeid支持运行时查询,但您正尝试在编译时使用它。

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

+0

感谢您的解释。 –

+0

C++不是“一种OO语言”(虽然这是它支持的范例),并不意味着它没有运行时类型。 Python是一种面向对象的语言,具有运行时类型,所以我不确定你想在第二段中说什么。 –

+0

@TobySpeight:在C++中,“动态类型”并不意味着类型是在运行时创建的。它特别用于表达式引用对象的上下文中,而对象的类型与表达式的类型不匹配。在这种情况下,表达式的类型被称为静态类型,而对象的类型被称为动态类型,而前者通常是后者的基类(忽略'void *')。这与C++的'dynamic_cast'有关。 – MSalters

1

有没有办法创建一个当前对象类型的指针?

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

我有一个基地class GraphicObjects能够作为容器行动从GraphicObjects

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

我认为这可能比明确指定类中的类型要好,所以我可以在别处使用它/更改类名。

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

我写了一个相当广泛的例子来演示使用polymorphisim与容器的位置:http://ideone.com/XSjMHW

编辑:

  1. 并非所有的对象将包含其他对象,这些节点对象其中不包含任何东西应该是一种类型,我们将其称为class Node,其中不包含其他物体
  2. 其他物体可能有自己的表情,还含有其他对象,这应该是一个独立的类型,我们把它叫做class ContainerContainer可无论是从Node继承或有一个成员Node,它还将包含其他Node S/Container小号
+0

感谢您的信息和示例。我的意思是**当前类型的指针**而不是**当前对象。有点超出了我原来的问题的范围,但我有一个从GraphicObject继承的Text图形对象。然后我有一个按钮对象,它包含一个Text对象以及它自己的按钮面的绘图代码。然后是一个可以包含零个或多个Graphic对象的Screen/Form对象。你会保持没有容器的GraphicObject,并在每个派生的对象中只有一个容器?我正在考虑一个非常简化版的.NET Control类 –

+0

@ mattb5906我编辑过,试图阐明一种客观的方法来设置你所描述的类结构。让我知道这是否合理。 –

+0

太棒了。谢谢你。 –

相关问题