Chinaunix

标题: Button->action_ can not be used as a function... [打印本页]

作者: bitzilla    时间: 2007-10-09 11:14
标题: Button->action_ can not be used as a function...
代码是根据《C++ common knowledge》上“command模式和好莱坞法则”这一节写的。
但是编译的时候有错。
其中,1. Button类的action_,报错-cannot be used as a function;
2. main()函数中的b->setAction(song);包错-no matching function for setAction(auto_ptr<layMusic>&;
应该怎么解决这两个问题呢?


#include <iostream>
using namespace std;

class Action {//command

public:
&nbsp;&nbsp;&nbsp;&nbsp;virtual ~Action(){};
&nbsp;&nbsp;&nbsp;&nbsp;virtual void operator() () = 0;
&nbsp;&nbsp;&nbsp;&nbsp;virtual Action *clone() const = 0;//prototype

};

class Button {
public:
&nbsp;&nbsp;&nbsp;&nbsp;Button(const string &label)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:label_(label), action_(0) { }
&nbsp;&nbsp;&nbsp;&nbsp;void setAction(const Action *newAction);
&nbsp;&nbsp;&nbsp;&nbsp;void onClick() const;
private:
&nbsp;&nbsp;&nbsp;&nbsp;string label_;
&nbsp;&nbsp;&nbsp;&nbsp;Action *action_;//command

};

void Button::setAction(const Action *newAction)
{
&nbsp;&nbsp;&nbsp;&nbsp;Action *tmp = newAction->clone();
&nbsp;&nbsp;&nbsp;&nbsp;delete action_;
&nbsp;&nbsp;&nbsp;&nbsp;action_ = tmp;
}

void Button::onClick() const
{
&nbsp;&nbsp;&nbsp;&nbsp;if(action_)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;action_();
}

class PlayMusic:public Action {
public:
&nbsp;&nbsp;&nbsp;&nbsplayMusic(const string &songfile):song_(songfile){}
&nbsp;&nbsp;&nbsp;&nbsp;void operator()();
&nbsp;&nbsp;&nbsp;&nbsplayMusic *clone() const;
private:
&nbsp;&nbsp;&nbsp;&nbsp;string song_;
};

void PlayMusic::operator()() //播放音乐动作的执行代码

{
&nbsp;&nbsp;&nbsp;&nbsp;cout<<"I am playing music, song name is "<<song_<<endl;
}

PlayMusic *PlayMusic::clone() const
{
&nbsp;&nbsp;&nbsp;&nbsp;return new PlayMusic(song_);
}

int main()
{
&nbsp;&nbsp;&nbsp;&nbsp;Button *b = new Button("Anoko no namaewa");
&nbsp;&nbsp;&nbsp;&nbsp;auto_ptr<PlayMusic>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;song(new PlayMusic("Anokononamaewa.mp3"));
&nbsp;&nbsp;&nbsp;&nbsp;b->setAction(song);
}





欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2