前向引用声明

前向引用声明  

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值