2013-10-13 49 views
0

有两类这样的:关于提前声明的C++类

class B; 

class A { 
public: 
    int a, b; 
    B *b; 
public: 
    int getctxt() 
    { 
    b->getctxt1(); 
    } 
} 

Class B { 
public: 
    int c,d; 
    A *a; 
    getctxt1() 
    { 
     /* something */ 
    } 
} 

main() 
{ 
    B *b = new B(); 
    A *a = new A(); 
    b->a = a; 
    a->b = b; 
} 

但是,当我尝试编译,它说

无效使用不完全型“结构A”的。

谁能告诉我如何解决这个问题?

+3

不应该在每个类声明结尾都有分号';'? ;-) – Jost

+0

请参阅这里:http://stackoverflow.com/questions/19343279/circular-dependecies-in-c-classes-that-dpend-each-other – littleadv

+0

不完整的类型'结构A'的无效使用你的代码。不过,还有很多其他错误。请发布与问题描述相关的代码(或与代码相匹配的问题描述)。 – Oswald

回答

2

内联类成员函数定义被解析,就好像它们出现在类定义之后一样。当然B在这一点上没有定义。因此,移动成员函数定义A::getctxt出来A类的定义:

class B; 

class A { int getctxt(); /* ... */ }; 

class B { /* ... */ }; 

int A::getctxt() 
{ 
    b->getctxt1(); // at this point, *b has complete type! 
    return -35; 
} 
+0

我做到了。直到我得到相同的错误:(..我移动了getctxt()的外部定义A. – user1667630

+0

@ user1667630:你移动它*过去* B的定义? –

0

这就是为什么我们建议您把班.h文件和.cpp文件分开的原因。当你编写class B;时,你告诉编译器有一个叫做B的类,但就是这样,编译器不知道这个类里面有什么。当编译器到达b->getctxt1();行时,它知道bB的一个实例,但它不知道getctxt1()是否为B的一种方法,因为它在下面。如果您将所有文件都写入单个文件中,则应首先编写所有声明,然后再编写所有实现。

0

没有人注意到Class B语法错误?小写class是正确的。 和A中的那两个公共成员int bB *b

一旦你删除这些并完成类定义使用分号,加void类型到缺少它B.

仅仅定义为它们应该被定义的功能void getctxt1()。不是没有内联的理由,你知道哪个是!