前向引用声明
2008-04-16 16:04:20
类间的交叉引用的情况, 需要前向引用声明.
前向引用声明不能声明该类的对象, 也不能在内联成员函数中使用该类的对象, 只能声明该类的指针, 引用, 函数形参和返回类型.
// Right.h /
// no #include "Left.h"
class CLeft; // 前向声明CLeft
class CRight
{
......
void r_f1(CLeft *pl1, CLeft &l2, CLeft l3); // ok
void r_f2(CLeft left){ left.fun(); } // error
CLeft r_f3(); // ok
CLeft *m_pleft; // ok
CLeft m_left; // error
}
// Right.cpp ///
#include "Right.h"
#include "Left.h"
void CRight::r_f(CLeft *pl1, CLeft &l2, CLeft l3)
{
......
}
CLeft CRight::r_f3()
{
CLeft left; return left;
}
// Left.h //
#include "Right.h"
class CLeft
{
......
void l_f(CRight r){ r.f();}
CRight m_right;
}
注意名称空间中类的前向声明
// Right.h /
// no #include "Left.h"
namesapce l_space
{ class CLeft; }; // 前向引用声明
namesapce r_space
{
using l_space::CLeft; // using声明
class CRight
{
......
void r_f(CLeft *pl1, CLeft &l2, CLeft l3); // ok
void r_f2(CLeft left){ left.fun(); } // error
CLeft r_f3(); // ok
CLeft *m_pleft; // ok
CLeft m_left; // error
};
};
// Right.cpp ///
#include "Right.h"
#include "Left.h"
using namesapce l_space; // using名称空间
void r_space::CRight::r_f(CLeft *pl1, CLeft &l2, CLeft l3)
{
......
}
CLeft r_space::CRight::r_f3()
{
CLeft left; return left;
}
// Left.h //
#include "Right.h"
namespace l_left
{
class CLeft
{
......
void l_f(r_space::CRight r){ r.f();}
r_space::CRight m_right;
};
};
但是: 类应该是高内聚, 低耦合的, 所以应该尽量避免这样的设计.
另, 关于名称空间和作用域还有些需要弄清楚, to be continue....
- by kevin.darkelf 20080416