一个问题,两人讨论,几行代码,一些启发

一个问题,两人讨论,几行代码,一些启发

 

By 刘未鹏(pongba)

刘言|C++的罗浮宫(http://blog.csdn.net/pongba)

 

Shen:请教一个问题,我简化一下,发给你:

 

PongbaOK

 

Shen: 就这样发给你吧,不多,我描述一下:

 

template<class T> class A { };

 

class B { public: A * m_task; };

 

class C: public B

{

public:

  C();

  C(A*);

};

 

typedef A<C> D;

 

C::C(A* p):m_task(p){};

 

定义了这几个类。

 

C::C(A * p) : m_task (p) 这句,是编译不过的,因为A是定义的模板类,该如何写?

 

Pongba: 当然不通过啊。你没给模板参数啊,A是模板类,要模板参数啊。

 

Shen: 是的,但是我写 C::C(D * p): m_task ( p ) 也是不对,似乎总是循环的,这样的定义的有问题,因为A<C>这时候C的构造函数中做,但是C还没有构造出来。

 

Pongba: 你要考虑的是你想表达的概念,类只是一个手段;首先明确这三个类的语意,而不是语法。

 

Shen: typedef A<C> D; 这里,我都多个不同的业务,所以定义不同的C

 

Pongba: A的语意是什么?

 

Shen: A是个基类,DA的不同业务,比如D1,D2...

 

Pongba: -_-||A当然是基类,我想知道的是A的目的是什么,A为什么有一个模板参数。这个模板参数放在那儿的初衷是什么。

 

Shen: class B { public: A * m_task; } 所以B中,有这样的定义。是希望通过C::C(A * p) : m_task(p) ,将B中的m_task指向A(当然是A的不同业务)。A的模板参数的原因,是因为我希望后面typedef A<C> D;

 

Pongba: B的成员不应该由C初始化,破坏了封装原则。

 

Shen: 也许还有C1 ,C2 ,所以希望 typedef A<C1> D1; typedef A<C2> D2; 因为有多个C,(如C1,C2,C3...

 

Pongba: 问题是为什么你希望typedef A<C> D; 我想知道的是A是个什么类。他的功能是什么。这么说吧,STLvector,他的语意是一组元素,他为什么要一个模板参数,是因为要参数化这组元素的类型。那么A的语意是什么,他为什么要一个模板参数。

 

Shen: A的作用是,有virtual函数,调用不同的业务。

 

Pongba: A业务类吗?

 

Shen: 错了,B是业务基类,刚才说错了。C是从B继承的,因为有多个C业务,比如C1,C2...

 

Pongba: 好,B是业务基类,所有从B继承的都是具体的业务类,Ci。这个理解对吧?

 

Shen: right

 

Pongba: 那么,还是那个问题,A的作用呢?是调用业务基类吗?也就是说A职责是什么。先把语言放在一边,考虑你的设计。

 

Shen: A的作用主要是线程处理。我再解释一下:A的作用,是把B的业务放入队列,取出处理等操作。至于怎么处理,就是B处理了,A只负责入出队列等操作。A有自己的队列和定时器等。

 

Pongba: 也就是说,A是一个任务调度器。只负责调度逻辑。对否?

 

Shen: 对。

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 10
    评论
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值