c++ - 为什么一个类不能在没有前向声明的情况下拥有指向另一个类实例的指针?

标签 c++ typename

我知道这是不可能的

class foo{
    foo bar;
};

因为编译器不知道要为foo 准备多少内存。 但是请考虑:

class A{
    B::C* foo;
};

class B{
    class C{
    };
};

无论 C 的定义如何,编译器都能准确知道 A 的大小似乎很合理。那为什么这不可能呢? (标准是否明确禁止这样做?为了什么?)


我有一个非常粗略的方法来绕过将 foo 视为 uintptr_t 的约束,然后 reinterpret_cast 将其返回到 C,这只是为了表明我真的没有得到(客观)原因,而且我知道如果没有正当理由使用它是一个非常非常糟糕的做法。


最后被标准禁止了。

最佳答案

接下来是一大挑战:

class other {};

namespace N {
  class foo {
    other* p;
  };

  class other {};
}

应该考虑哪个other*?编译器的工作量太大。虽然我们可以通过 ::otherN::other 来明确,但在上述情况下仍然会造成混淆。

关于c++ - 为什么一个类不能在没有前向声明的情况下拥有指向另一个类实例的指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38625886/

相关文章:

c++ - 为什么必须在何处以及为什么要放置"template"和"typename"关键字?

header 命名空间中的 C++ typedef 包含项找不到类型

c++ - 为什么必须在哪里放置 “template”和 “typename”关键字?

c++ - 可按参数类型更改 "return type template"

c++ - 为什么必须在何处以及为什么要放置"template"和"typename"关键字?

python - 如何定义 "operator()"C++ 类方法的 python pybind11 绑定(bind)?

c++ - Link Error : xxx is already defined in *****.LIB::究竟是什么错误?

c++ - 未知的 GCC 链接器错误,但构建成功

c++ - 为什么这个段错误没有

c++ - x64 函数调用参数推送/移动顺序 (MSVC)