用函数指针始终不能正常调用类的非静态成员函数,求解~

C艾斯蒂嗯蟹 2017-07-03 11:27:04
想做一个类似C#中委托事件,设计一个"发布/订阅者"模式,
就是猫叫,然后老鼠跑了
但是运行就崩...
Cat.h
#pragma once
#include <vector>
using namespace std;
class Mouse;
class Cat
{
private:
typedef void(Mouse::*CatMiaow)();
public:
Cat();
~Cat();
static struct OnCatMiaow
{
CatMiaow catMiaow;
Mouse* Mouse;
};
vector<OnCatMiaow> vec_OnCatMiaow;
void Miaow();
};


Cat.cpp
#include "Cat.h"
#include <iostream>
Cat::Cat()
{
}


Cat::~Cat()
{
}

void Cat::Miaow()
{
vector<OnCatMiaow>::iterator it = vec_OnCatMiaow.begin();
for (it; it != vec_OnCatMiaow.end(); it++)
{
(it->Mouse->*it->catMiaow)();
//(vec_OnCatMiaow[i].Mouse->*vec_OnCatMiaow[i].catMiaow)();
}
}


Mouse.h
#pragma once
class Cat;
class Mouse
{
public:
Mouse();
~Mouse();

void EnterOnCatMiaow(Cat *cat);
void MouseRun();
};


Mouse.cpp
#include "Mouse.h"
#include "Cat.h"
#include <iostream>
Mouse::Mouse()
{
}


Mouse::~Mouse()
{
}


void Mouse::EnterOnCatMiaow(Cat *cat)
{
cat->vec_OnCatMiaow.push_back({ &Mouse::MouseRun, this });
//Cat::OnCatMiaow *tmpStruct = new Cat::OnCatMiaow();
//tmpStruct->catMiaow = &Mouse::MouseRun;
//tmpStruct->Mouse = this;
//cat->vec_OnCatMiaow.push_back(tmpStruct);
//错误: 无法将参数 1 从“Cat::OnCatMiaow *”转换为“Cat::OnCatMiaow &&”

}

void Mouse::MouseRun()
{
std::cout << "老鼠跑了" << endl;
}


Main

#include <iostream>
#include <windows.h>
#include "Cat.h"
#include "Mouse.h"
using namespace std;
int main()
{
Cat cat1 = Cat();
Mouse mouse1 = Mouse();
mouse1.EnterOnCatMiaow(&cat1);
cat1.Miaow();
return 0;
}
...全文
201 4 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
xskxzr 2017-07-05
  • 打赏
  • 举报
回复
错误提示不是很明显吗?你要直接push_back一个对象
真相重于对错 2017-07-04
  • 打赏
  • 举报
回复
百度 “类成员函数指针”
ztenv 版主 2017-07-03
  • 打赏
  • 举报
回复
学习一下观察者模式吧

65,199

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧