C++ 正向声明 - 不允许使用不完整的类型

C++ Forward Declaration - Incomplete type is not allowed

提问人:TokaraForest 提问时间:6/24/2022 最后编辑:cigienTokaraForest 更新时间:6/25/2022 访问量:96

问:

我有多个类,并按顺序编写它们。First class 有一个枚举,但我想将其移动到所有其他类下面的类。这就是问题开始的地方。由于最后一个类将具有该枚举,因此在第一个类中使用枚举的成员会出错。

初始代码如下:

文件.hpp:

class A
{
public:
    typedef enum
    {
        eOk = 0x00;
        eError = 0x01;
    }myEnum_et;

    typedef myEnum_et(*callbackType)(B*);
    callbackType myCallback;

public:
    void foo1(callbackType callbackParam)
    {
        myCallback = callbackParam;
    }

    myEnum_et foo2()
    {
        return myCallback;
    }
};

class B
{
public:

    A::myEnum_et foo3(A *a)
    {
        if(a->foo2() == NULL) return A::eOk;
        else return A::eError;
    }
};

class C
{
public:
    B *b;

    void foo4(B *new_b)
    {
        b = new_b;
    }    
};

我想做的是:

class C;
class B;

typedef C::myEnum_et(*callbackType)(B*);

class A
{
public:
    callbackType myCallback;

public:
    void foo1(callbackType callbackParam)
    {
        myCallback = callbackParam;
    }

    myEnum_et foo2()
    {
        return myCallback;
    }
};

class B
{
public:

    C::myEnum_et foo3(A *a)
    {
        if(a->foo2() == NULL) return C::eOk;
        else return C::eError;
    }
};
    
class C
{
public:
    typedef enum
    {
        eOk = 0x00;
        eError = 0x01;
    }myEnum_et;

    B *b;

    void foo4(B *new_b)
    {
        b = new_b;
    }    
};
  

如上所示,我只想将myEnum_et从 A 类移动到 C 类,并将函数指针移动到类 A 的范围之外。如您所知,在代码顶部声明 B 类对于将使用 myEnum_et 的人来说是不够的。我想原因是编译器需要 B 类的完整定义。这是错误:

#71 不允许输入不完整的类型。

我知道代码的可读性很丑陋。我只是想表明所有类的定义都相互依赖,并希望在此类顺序上使用正向声明(或其他解决方案)。顺便说一下,我使用C++03,所以我有点受限。

C++ 正向声明 C++03 不完整类型

评论


答: 暂无答案