我可以有一个指向类本身的指针,而不仅仅是一个指向变量的指针吗?
// 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;
最佳答案
在某些语言中,类型是一等对象,这意味着您可以将它们作为参数传递、内省(introspection)它们的类属性等。
在类型是对象的语言中,您可以引用或指向这些对象。
在 C++ 中,类型在编译时使用,然后实际上不复存在。它们从不表示为一流对象,并且您无法在运行时真正内省(introspection)它们。
在类型不是对象的语言中,您不能引用或指向这些对象,因为它们不存在。
要用 C++ 实现一门新语言,您的起点太低了:在您可以用新语言定义用户定义类型之前,您需要知道该类型将是什么类型在您的实现代码中。
例如,在 Python 中:
class A: pass
class B: pass
定义两个(空)class objects ,称为 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 的一流对象。
关于C++ - 指向类类型的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57144778/