我试图在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 ++ Faq,我得到的密集是here和here但是
那些不适用于我的情况。
我也是read this来自这里,但它没有解决我的问题。
gcc和MSVC 2005都会在此
上出现编译错误答案 0 :(得分:15)
表达式c->i
取消引用指向struct A::B
的指针,因此程序中此时必须显示完整定义。
最简单的解决方法是使A
的构造函数非内联,并在struct A::B
定义后为其提供正文。
答案 1 :(得分:11)
在结构B的定义之后定义A的构造函数。
答案 2 :(得分:7)
这是一个很好的例子,说明为什么要将定义与声明分开。您需要更改事物的顺序,以便在A::A()
的定义之后定义构造函数struct A::B
。
class A
{
struct B;
B* c;
A();
};
struct A::B
{
int i;
};
A::A() { c->i; }
int main()
{
return 0;
}
答案 3 :(得分:1)
有趣的是,我在Stroustrup一书中提到的第293页('11 .12字符串类')遇到了同样的问题。
印刷书中提供的示例似乎有问题,提供以下方法作为内联,而不是在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 Class实现,可以在这里找到: http://www2.research.att.com/~bs/string_example.c
他似乎修改了它,以便这些方法不再内联,以避免此线程中提到的问题。