【问题标题】:C++ Nested classes forward declaration errorC++ 嵌套类前向声明​​错误
【发布时间】:2023-03-25 04:45:01
【问题描述】:

我正在尝试在 A 类中声明和使用 B 类 并在 A 之外定义 B。
我知道这是可能的,因为 Bjarne Stroustrup
在他的《C++ 编程语言》一书中使用了这一点
(第 293 页,例如 String 和 Srep 类)。

所以这是我导致问题的最小代码段

class A{
struct B; // forward declaration
B* c;
A() { c->i; }
};

struct A::B { 
/* 
 * we define struct B like this becuase it
 * was first declared in the namespace A
 */
int i;
};

int main() {
}

此代码在 g++ 中给出以下编译错误:

tst.cpp: In constructor ‘A::A()’:
tst.cpp:5: error: invalid use of undefined type ‘struct A::B’
tst.cpp:3: error: forward declaration of ‘struct A::B’

我试图查看 C++ 常见问题解答,我得到的最接近的是 herehere 但是
这些不适用于我的情况。
我也从这里read this,但这并没有解决我的问题。

gcc 和 MSVC 2005 都给出了编译器错误

【问题讨论】:

    标签: c++ class nested declaration forward


    【解决方案1】:

    表达式c->i 取消引用指向struct A::B 的指针,因此此时程序中的完整定义必须可见。

    最简单的解决方法是使A 的构造函数非内联,并在struct A::B 的定义之后为其提供一个主体。

    【讨论】:

    • 或者,在struct B的定义之后使用inline关键字将函数定义为内联。
    【解决方案2】:

    在定义结构 B 之后为 A 定义构造函数。

    【讨论】:

    • 构造函数是在声明B之后定义的。需要在定义B之后再定义。
    • 已更新以将“声明”替换为“定义”。 :-)
    【解决方案3】:

    这是一个很好的例子,说明了为什么要将定义与声明分开。您需要更改事物的顺序,以便在 struct A::B 的定义之后定义构造函数 A::A()

    class A
    {
        struct B;
        B* c;
        A();
    };
    
    struct A::B
    {
        int i;
    };
    
    A::A() { c->i; }
    
    int main()
    {
        return 0;
    }

    【讨论】:

      【解决方案4】:

      有趣的是,我在 Stroustrup 书中提到的第 293 页('11.12 A String Class')遇到了同样的问题。

      印刷书中提供的例子似乎有问题,提供了以下方法作为内联,而不是在struct Srep的定义之后定义它们

      class String {
        // ...
        void check(int i) const { if (i<0 || rep->sz <=i) throw Range(); }
        char read(int i) const { return rep->s[i]; }
        void write(int i, char c) { rep=rep->get_own_copy(); rep->s[i]=c; }
        ...etc...
      

      我google了一下,找到了作者最新的这个String类的实现,可以在这里找到: http://www2.research.att.com/~bs/string_example.c

      他似乎已经修改了它,使这些方法不再是内联的,以避免这个线程中提到的问题。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-10-31
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多