免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2606 | 回复: 0
打印 上一主题 下一主题

Button->action_ can not be used as a function... [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-10-09 11:14 |只看该作者 |倒序浏览
代码是根据《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);
}
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP