gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:58:06 26 4
gpt4 key购买 nike

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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com