读书人

求批评小弟我刚开始看Headcall Firs

发布时间: 2012-03-29 12:53:12 作者: rapoo

求批评,我刚开始看Headcall First设计模式
菜鸟一名,以前浪费了很多时间。刚开始看书,写了一个小程序。就是它有关Duck的说明,我也不知道这个是什么模式。我自己觉得写的很不优雅,虽然能正常输出。比如该用接口也就是抽象类,结果我不会弄。而且用了很多指针。

.h文件

C/C++ code
class FlyBehavior//这里想用抽象类,感觉才规范。可是不知道该如何弄{public:    FlyBehavior(void){};    virtual ~FlyBehavior(void){};    virtual void fly(void){};};class QuackBehavior//这里想用抽象类,感觉才规范。可是不知道该如何弄{public:    QuackBehavior(void){};    virtual ~QuackBehavior(void){};    virtual void quack(void){};};class FlyWithWings : public FlyBehavior{public:    FlyWithWings(){};    void fly(){cout<<"I can fly with wings!"<<endl;};};class FlyNoWay : public FlyBehavior{public:    FlyNoWay(){};    void fly(){cout<<"I can't fly any way."<<endl;};};class Quack : public QuackBehavior{public :    Quack(){};    void quack(){cout<<"I can quack!"<<endl;};};class Squeak : public QuackBehavior{public:    Squeak(){};    void quack(){cout<<"I can squeak"<<endl;};};class Duck{public:    Duck(void);    ~Duck(void);    FlyBehavior* flyBehavior;//这里觉得似乎不该用指针    QuackBehavior* quackBehavior;    void performQuack();    void performFly();    void setFlyBehavior(FlyBehavior* f);    void setQuackBehavior(QuackBehavior* q);};class MallardDuck : public Duck{public :    MallardDuck()    {        this->flyBehavior = new FlyWithWings();        this->quackBehavior = new Squeak();    }};


cpp文件
C/C++ code
Duck::Duck(void){}Duck::~Duck(void){}void Duck::performFly(){    this->flyBehavior->fly();}void Duck::performQuack(){    this->quackBehavior->quack();}void Duck::setFlyBehavior(FlyBehavior* f){    this->flyBehavior = f;}void Duck::setQuackBehavior(QuackBehavior* q){    this->quackBehavior = q;}

测试代码
C/C++ code
int _tmain(int argc, _TCHAR* argv[]){    Duck* myDuck = new MallardDuck();    myDuck->performQuack();    myDuck->performFly();    Duck* model = new ModelDuck();    model->performFly();    model->setFlyBehavior(new FlyWithWings());//题外话,这里new出来的东西,怎么delete呢?    model->performFly();    return 0;}

运行结果
C/C++ code
I can squeakI can fly with wings!I can't fly any way.I can fly with wings!


[解决办法]
看看先~~
[解决办法]
抽象类请给它定义纯虚析构函数,注意纯虚析构函数虽然是“纯虚”的,但是必须有函数体

class AbstractClass
{
public:
virtual ~AbstractClass() = 0;

public:
// 其他函数 如果有的话
};

// 纯虚析构函数体
AbstractClass::~AbstractClass()
{}
[解决办法]
仔细看了一下,写得不错呀。
用了两种模式:Builder和Factory Method(代码表现得不是很明显)

接口确实通常以抽象类来实现。但用带虚函数的类也是没有问题的,只要你在派生类覆盖基类的虚函数就可以了(纯虚函数的意思就是强迫你这么干,否则编译出错)

在Duck类中用指针作为成员变量也没有什么问题。

有一个小问题,MallardDuck要提供析构函数,否则会出现memory leak之类的问题。
C/C++ code
class MallardDuck : public Duck{public :    MallardDuck()    {        this->flyBehavior = new FlyWithWings();  // 在析构函数里要delete flyBehavior        this->quackBehavior = new Squeak();      // 在析构函数里要delete quackBehavior    }};
[解决办法]
探讨


接口确实通常以抽象类来实现。但用带虚函数的类也是没有问题的,只要你在派生类覆盖基类的虚函数就可以了(纯虚函数的意思就是强迫你这么干,否则编译出错)

读书人网 >C++

热点推荐