C++:如何使用尚未定义的类型?

标签 c++ header declaration forward-declaration

C++ 要求在使用前定义所有类型,因此以正确的顺序包含头文件非常重要。美好的。但是我的情况呢:

Bunny.h:

   class Bunny
   {
       ...
   private:
       Reference<Bunny> parent;
   }

编译器提示,因为技术上 Bunny 在我用它自己的类定义时还没有完全定义。 因为我做了一些愚蠢的事情(无关)。

除了重写我的模板类 Reference 使其采用指针类型(在这种情况下我可以使用 Bunny 的前向声明),我不知道怎么解决。

有什么建议吗?

编辑:我的Reference 类(XObject 是数据模式对象的基类):

template <class T = XObject> class Reference
{
public:
    Reference() : m_ptr (NULL) {}
    Reference(T* p)
    {
        m_ptr = p;
        if (p != NULL) ((XObject*)p)->ref();
    }
    ~Reference()
    {
        if (m_ptr)
        {
            ((XObject*)m_ptr)->deref();
        }
    }

    // ... assignment, comparison, etc.

private:
    T* m_ptr;
}; 

编辑:这工作正常,问题出在其他地方。非常感谢您的帮助!

最佳答案

您问题的答案取决于 Reference<> 的外观。如果它有一个 Bunny 类型的实例变量,那么它当然不会工作(它怎么会,你有一个永不结束的递归定义)。如果其中只有引用和指针,那么它应该可以正常工作。模板实例化中的 Bunny 类型不会干扰这一点。

编辑(发布引用<>代码编辑):

我似乎无法重现您的问题。我已经像你正在做的那样重新实现了代码,但它对我来说编译得很好:

struct base {
  void fun() {}
};
template < typename T >
struct temp
{
  T * t;

  void f() { ((base*)t)->fun(); }
};

struct test
{
  temp<test> t;

};

int main()
{
  test t;
  t.t.f();
}

这显然是无效代码,因为您将得到未定义的结果,但它确实可以编译。这里的主要问题是从类型 test* 到类型 base* 的重新解释转换。如果 test 确实从 base 继承,那么甚至不需要强制转换。像这样的代码不会按预期运行,但应该可以正常编译。我的一个建议是放弃所有 c 风格的转换。这不会解决您遇到的问题,无论它是什么......它必须位于您未粘贴的代码中的某个位置。

关于C++:如何使用尚未定义的类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2968915/

相关文章:

c++ - 无法在其他类 C++ 之前访问类

c - switch 语句中的声明

c++ - 在 C++ 中初始化对象之前声明一个对象

c++ - C++中的简单文本编辑程序

c++ - 为什么 ofstream 比 fprintf 慢?

c++ - 难以理解 C++ 程序、shift 和 &

c++ - 如何使用 stringstream 分隔逗号分隔的字符串

header - HAProxy - 添加响应 header 以指示选择的服务器

c++ - 找不到为什么 g++ 认为函数未在范围内声明

css - 为什么 CSS 类声明不适用于标记的 <div>?