这两天帮朋友看一个课程设计,需要用到两个类 形成嵌套。 要求内部类 能处理外部类 的内容。刚开始自然想到的是回调函数思想,后来想了一下可以这样实现:
一些最初的问题
1. 内部类调用外部类 自然产生了越界的想法, 首先是封装性的问题。
2. 使用接口来完成这种调用,需要获取外部类的地址 , 在运行时,将该地址传给内部类的外部接口指针。
这个问题也没有太大的难度,就是用的少了一些。但是想想蛮有意思的,就做了一下。
思想: 在内层类设计一个指向 外层类接口的指针 , 那么就可以通过这个接口指针完成内层类对外层类操作的调用 , 如何得到
设计如下:
用组件模型来完成, 内层类为 客户类 C 外层类为 窗口类 W
interface IC //
{
virtual void _stdcall Fc1()=0;
virtual void _stdcall Fc2()=0;
};
interface IW //: public IC
{
virtual void _stdcall Fw1()=0;
virtual void _stdcall Fw2()=0;
};
class CC : public IC
{
public :
virtual void _stdcall Fc1(){cout <<"CC::Client1"<<endl; pIW_in_CC->Fw1(); }
virtual void _stdcall Fc2(){cout <<"CC::Client2"<<endl;}
IW *pIW_in_CC;
};
class CW : public IW
{
public:
CW();
virtual void _stdcall Fw1(){cout<< "CW::Windows1"<<endl; }
virtual void _stdcall Fw2(){cout<< "CW::Windows2"<<endl;}
virtual void _stdcall FI_1( CW *pTemp_CW ){ C_Example->pIW_in_CC = pTemp_CW;}
virtual CC * _stdcall FI_2( ){ return C_Example;}
protected:
CC *C_Example; //指向内层类的指针
IC *pIC_in_CW;
};
CW :: CW()
{
C_Example = new CC; //保存内层类的地址
pIC_in_CW = NULL;
}
int main()
{
trace ("Client : Create an instance of the component.");
CW *pW = new CW; //生成一个外层组件CW 其中就自然包括生成了一个内层组件CC
pW->FI_1(pW); //使得内层类的 指向外层类接口的指针指向外层类
//那么这样,就可以用内层类来获取外层类的操作。但是还剩下最后一个问题:
//我们只有外层类的地址,没有内层类的地址,那么内层类的接口在哪里呢?
//在外层类结构里,我们用链表的形式来生成了内层类,那么内层类的地址就保存在C_Example中(在FI_2())函数中处理。
IC *pIC = pW->FI_2();
pIC->Fc1(); //那么自然就可以使用内层类的接口来完成这种越界调用了
return 0;
}