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

标签 c++

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

// 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 ,称为 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 的一流对象。

关于C++ - 指向类类型的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57144778/

相关文章:

c++ - 每个解决方案一个版本的 nuget 包(但不是最新的)

c++ - 如何使用 ntquerydirectoryfile 函数 Hook 隐藏文件夹

c++ - 具有结构 vector 的类,其中包含相同的类

c++ - 如何修复无限 while 循环?

c++ - 调试有限状态机拼写检查程序代码

c++ - 键入 Alt 键时可能会在 char 中解决 "Invalid Octal Digit"

c++ - 输入一定数量后的垃圾值

c++ - 如何在 OpenGL 中使用框选择有效地选择对象

c++ - Il 不匹配 'P1' 版本 '20080116' 和 'P2' 版本 '20070207'

c++ - 如何构建包含“