2010-08-17 70 views
3

这可能看起来很奇怪,但我的程序中有一个问题,我有一个类A需要一个类B的变量,而类B需要一个指向内部类A的指针,以便我可以确定哪些类别附加到什么...B类中的A类变量和A类中的B类指针变量?

我得到的错误是因为在A类中它表示B类尚未定义,而在B类中它表示A类尚未定义...

我的两个包含单独的类的头文件包含了彼此,我试图转发声明我的类,例如A类; B类;但我得到编译器错误,如:

error C2079: 'CFrame::menu' uses undefined class 'CMenu' 

我需要一个指向类B的类A的指针,因为我想稍后将它传递给另一个类。

+0

难以表达的事物通常更难以理解。是的,现在你知道什么是前向声明了,这并不难,但是到8分钟前,这对你来说是“不可能的”。 – msw 2010-08-17 23:05:18

回答

6

需要声明A定义B前:

class A; // declaration of A 

class B // definition of B 
{ 
    A* foo; 
    // ... 
}; 

class A // definition of A 
{ 
    B bar; 
    // ... 
}; 

这种声明往往被称为向前声明

+1

问题是,您只使用B的前向声明,而不是A,因为A包含B类型的实例变量而不是指针。 – 2010-08-17 22:59:25

+0

啊是的,我在这里有一个大混乱,我实际上这样做,但我已经意识到,我的“安全卫士”,例如。 #ifndef CMENU_INCLUDED #define CMENU_INCLUDED,搞乱了它,所以我在它们之前包含了一个标题,并且只做了一个前向声明,现在它可以工作!谢谢 – Kaije 2010-08-17 23:02:11

+0

它依赖于3.9.2/3 - “指向不完整类型的指针是允许的,尽管对它们可以完成的操作有限制(3.9)”。因此,具有指向B的指针是合理的,即使B在该点上不完整 – Chubsdad 2010-08-18 02:34:57

2

首先,考虑重新设计你的类。循环依赖是不好的做法,而且你可以用更优雅的类设计完全避免这种情况。

class B; 

class A 
{ 
    B *pPtr; 
}; 

class B 
{ 
    A typeA; 
}; 
0

您可以简单的通过指定什么,以避免前向声明 -

这就是说,你可以使用向前引用(在这一点上,你需要使用指针或引用)解决该问题得到“B”是:

class A 
{ 
public: 
    class B* pB; 
}; 

class B 
{ 
public: 
    A a; 
}; 

如果您遇到问题,可能是因为您的执行与声明一起。如果将实现和头部分开,那么在这种情况下可能会出现更少的问题。

相关问题