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

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;
}
...全文
197 4 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
xskxzr 2017-07-05
  • 打赏
  • 举报
回复
错误提示不是很明显吗?你要直接push_back一个对象
真相重于对错 2017-07-04
  • 打赏
  • 举报
回复
百度 “类成员函数指针”
ztenv 版主 2017-07-03
  • 打赏
  • 举报
回复
学习一下观察者模式吧
第一篇 基础知识篇 实例1 数据型转换 实例2 转义字符 实例3 关系和逻辑运算 实例4 自增自减 实例5 普通位运算 实例6 位移运算 实例7 字符译码 实例8 指针操作符 实例9 if判断语句 实例10 else-if语句 实例11 嵌套if语句 实例12 switch语句 实例13 for语句 实例14 while语句 实例15 do-while语句 实例16 break和continue语句 // 实例17 exit()语句 // 实例18 综合实例 实例19 一维数组 实例20 二维数组 实例21 字符数组 // 实例22 数组初始化 // 实例23 数组应用 实例24 函数的值调用 实例25 函数的引用调用 //swap 实例26 数组函数调用 // 实例27 命令行变元 // 实例28 函数的返回值 实例29 函数的嵌套调用 实例30 函数的递归调用 实例31 局部和全局变量 实例32 变量的存储别 实例33 内部和外部函数 实例34 综合实例1 实例35 综合实例2 实例36 变量的指针 实例37 一维数组指针 实例38 二维数组指针 实例39 字符串指针 实例40 函数指针 实例41 指针数组 实例42 二维指针 实例43 指针的初始化 实例44 综合实例 第二篇 深入提高篇 实例45 结构体变量 实例46 结构体数组 实例47 结构体指针变量 实例48 结构体指针数组 实例49 共用体变量 实例50 枚举型 实例51 读写字符 实例52 读写字符串 实例53 格式化输出函数 实例54 格式化输入函数 实例55 打开和关闭文件 实例56 fputc()和fgetc() 实例57 函数rewind() 实例58 fread()和fwrite() 实例59 fprintf()和fscanf() 实例60 随机存取 实例61 错误处理 实例62 综合实例 实例63 动态分配函数 实例64 常用时间函数 实例65 转换函数 实例66 查找函数 实例67 跳转函数 实例68 排序函数 实例69 伪随机数生成 实例70 可变数目变元 第三篇 常用算法篇 实例71 链表的建立 实例72 链表的基本操作 实例73 队列的应用 实例74 堆栈的应用 实例75 串的应用 实例76 树的基本操作 实例77 冒泡排序法 实例78 堆排序 实例79 归并排序 实例80 磁盘文件排序 实例81 顺序查找 实例82 二分法查找 实例83 树的动态查找 实例84 二分法求解方程 实例85 牛顿迭代法求解方程 实例86 弦截法求解方程 实例87 拉格朗日插值 // 实例88 最小二乘法拟合 ?? 实例89 辛普生数值积分 实例90 改进欧拉法 实例91 龙格-库塔法 实例92 高斯消去法 实例93 正定矩阵求逆 第四篇 综合应用篇 实例94 用C语言实现遗传算法 实例95 人工神经网络的C语言实现 实例96 K_均值算法 实例97 ISODATA算法 实例98 快速傅立叶变换 实例99 求解野人与传教士问题 实例100 简单专家系统

65,186

社区成员

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

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