[英]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
定义两个(空) 类对象 ,称为A
和B
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 = ∫
上班? 这是同一件事。
PS:也许您正在尝试实践多态性范例,请在线阅读。
您可以有一个指针,指向由操作员typeid
返回的有关type- type_info
编译器信息。 但是看起来这不是您所需要的。 您应该阅读有关模式“ Factory Method”和“ Abstract Factory”的信息 。
“工厂方法”模式看起来很接近您的代码示例。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.