关闭

程序设计3

标签: class算法ini任务null测试
1015人阅读 评论(1) 收藏 举报
分类:

 

有这样一种需求,两个类:

class A

{

    B b;

    //在成员函数中使用b

};

 

class B

{

//需要调用A的成员函数(算法)

};

 

这种情况下,A类是一个全局的控制类,它有一系列的算法调用各个子模块,然而子模块在自己的任务中,有时需要回调全局控制类A的算法。设计一种什么结构可以完成这种需求?

现在的方法是,把需要回调的A的算法做成一个接口,A类从这个接口继承,B类拥有这个接口的一个指针,并提供该接口指针的初始化函数。把A类的this指针初始化给b,使得B类可以通过该接口回调A类的算法。按照这种思路,下面是一个测试例子:

//接口

#ifndef __IBS_H__

#define __IBS_H__

 

class IBS

{

public:

     IBS(void);

     ~IBS(void);

     virtual void Print(int Val) = 0;

};

 

#endif //__IBS_H__

 

     //相当于B类:拥有接口的指针及初始化方法

#ifndef __SMALL_H__

#define __SMALL_H__

#include "IBS.h"

 

class CSmall

{

public:

     CSmall(void);

     ~CSmall(void);

     void Ini(IBS* pBS);

     void SmallPrint(int Val);

private:

     IBS* m_pBS;

};

 

#endif //__SMALL_H__

 

#include "StdAfx.h"

#include "./small.h"

 

CSmall::CSmall(void)

{

     m_pBS = NULL;

}

 

CSmall::~CSmall(void)

{

}

 

void CSmall::SmallPrint(int Val)

{

     if( m_pBS )

         m_pBS->Print(Val);

}

 

void CSmall::Ini(IBS* pBS)

{

     m_pBS = pBS;

}

 

     //相当于A类:对接口继承实现

#ifndef __BIG_H__

#define __BIG_H__

 

#include "IBS.h"

#include "Small.h"

 

class CBig:

     public IBS

{

public:

     CBig(void);

     ~CBig(void);

     void Print(void);    //对外方法

    void Ini(void);

private:

     CSmall m_Small;

private:

     void Print(int Val); //实现纯虚方法

     int BigPrint(int Val);

};

 

#endif //__BIG_H__

 

#include "StdAfx.h"

#include "./big.h"

 

CBig::CBig(void)

{

}

 

CBig::~CBig(void)

{

}

 

int CBig::BigPrint(int Val)

{

     std::cout<<"/nin BigPrint:/t"<<Val<<"/n";

     return 0;

}

 

void CBig::Print(int Val) //纯虚方法实现

{

     BigPrint(Val);

}

 

void CBig::Print(void)

{

     m_Small.SmallPrint(0); //small print

}

 

void CBig::Ini(void)

{

     m_Small.Ini(this); //指向this

}

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:127656次
    • 积分:1889
    • 等级:
    • 排名:千里之外
    • 原创:59篇
    • 转载:3篇
    • 译文:0篇
    • 评论:55条
    最新评论
    友情blog