繁体   English   中英

C ++-指向类类型的指针

[英]C++ - Pointer to class type

我可以有一个指向类本身的指针,而不仅仅是指向变量的指针吗?

// I'm looking for something like this
class MyClass {};

MyClass* ptr = &MyClass;

MyClass* myclass = new *ptr;

// But not this
class MyClass {};

MyClass myclass;

MyClass* ptr = myclass;

在某些语言中,类型是一流的对象,这意味着您可以将它们作为参数传递,检查它们的类属性等。

在一种类型为对象的语言中,您可以引用或指向这些对象。

在C ++中,类型在编译时使用,然后实际上不复存在。 它们永远不会被表示为一流的对象,并且您在运行时无法真正进行内省。

在一种类型不是对象的语言中,您不能引用或指向这些对象,因为它们不存在。


为了实现在C ++中一种新的语言,你开始一个级别太低:之前,你可以在你的新的语言定义一个用户定义类型,你需要知道类型将在您的实现代码是什么类型。

例如,在Python中:

class A: pass
class B: pass

定义两个(空) 类对象 ,称为AB CPython实现中没有两种相应的C结构类型。 不可能,因为CPython解释器在看到我们的Python代码之前就已经被编译(现在是固定的密封可执行文件)。

因此,我们必须改为定义单个C ++类型,该类型以您的新语言描述用户定义的类型。 每个用户定义的类型都是该C ++类型的实例

例如:

struct UserDefinedType: public Object
{
  std::string name;
  std::vector<std::shared_ptr<Object>> members;
  std::vector<std::shared_ptr<Function>> methods;
};

std::vector<std::shared_ptr<UserDefinedType>> types;

用你的新语言,像

class MyClass {};

将在C ++中通过以下方式实现:

case KEYWORD_CLASS:
  types.push_back(make_shared<UserDefinedType>(parser.getName(),
                                               parser.getMembers(),
                                               parser.getMethods()));
  break;

注意 我们还没有讨论采用指针一类新的语言 但是,我使UserDefinedType结构派生自Object ,这意味着您可以将它们用作类似Python的一流对象。

的种类。

std::type_info是一个“描述”类型的对象。 您可以使用typeid运算符获得一个。

但是,由于C ++不支持反射,因此您几乎无法使用反射。 例如,您将无法“解引用”它以生成指向成员的指针。

您当然不能形成指向类型的普通指针。

我可以给课程本身一个指针吗

否。有指向对象,函数和成员的指针。 在C ++中,通常没有指向类或类型的指针。

我可以有一个指向类本身的指针,而不仅仅是指向变量的指针吗?

不行

一个类基本上是一个类型,指向一个类型没有意义。

正如@SomeProgrammerDude所评论的:您期望例如int* ptr = &int; 上班? 这是同一件事。

PS:也许您正在尝试实践多态性范例,请在线阅读。

您可以有一个指针,指向由操作员typeid返回的有关type- type_info编译器信息。 但是看起来这不是您所需要的。 您应该阅读有关模式“ Factory Method”“ Abstract Factory”的信息

“工厂方法”模式看起来很接近您的代码示例。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM