科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道应用软件C 中的抽象

C 中的抽象

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

C 的抽象应该是指:从我们需要解决的问题出发,在与该问题相关的一组关联对象中提取出主要的或共有的部分――说简单一点,就是用相同的行为来操作不同的对象。

作者:中国学习联盟 来源:中国学习联盟 2007年9月14日

关键字:

  • 评论
  • 分享微博
  • 分享邮件

以上方法用模板的方式来产生对象的代理。优点是完全未损失C++类型安全检查的特性,class object的一般普通成员函数就可以进行抽象调用了。缺点是调用的函数名被事先确定了――但这往往是不能接受的。为了改进这一点我在后来的使用中引入了member function pointer。代码如下:

#include<list>

class parent

{

public:

virtual ~parent(){};

virtual void do1( void ) const = 0;

virtual int do2( char* ) const = 0;

};

template< typename T >

class child : public parent

{

typedef void (T::*PFUN1)( void );

typedef int (T::*PFUN2)( char* );

public:

virtual ~child()

{

delete tu;

}

//////////////////////////////////////

child( PFUN1 p1 ):

fun1(p1), fun2(NULL)

{

tu = new T;

}

//------------------------------------

child( PFUN2 p2 ):

fun1(NULL), fun2(p2)

{

tu = new T;

}

//-------------------------------------

child( PFUN1 p1, PFUN2 p2 ):

fun1(p1), fun2(p2)

{

tu = new T;

}

////////////////////////////////////////

int do2( char *pch ) const

{

return fun2?(tu->*fun2)( pch ) : -1;

}

void do1( void ) const

{

fun1?(tu->*fun1)() : -1;

}

private:

T *tu;

PFUN1 fun1;

PFUN2 fun2;

};

class test

{

public:

void test1( void )

{

::MessageBox( NULL, "Test", "test...ok!", MB_OK );

}

};

int main()

{

using namespace std;

list< parent* > plist;

parent *par = new child<test>( test::test1 );

plist.push_back( par );

}

在这个例子中我只引用了两种类型的member function pointer:

typedef void (T::*PFUN1)( void );

typedef int (T::*PFUN2)( char* );

按上面的方法很容易扩展到其他函数类型。Construct child( PFUN1 p1, PFUN2 p2 )只是为了说明一个class object可以注册多种方法。更好的做法可能是将函数注册功能独立成一个函数。

总体来说以上方法只能作为一个特例来看。我们总是应该以常规的C++的方式进行抽象。C++中关于抽象的一些限制并不是我们进行抽象的阻碍。我们应该把它们看作“桥上的栏杆”,他们可以保证我们的逻辑思维沿着正确地方向前进!

查看本文来源

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章