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

C艾斯蒂嗯蟹 C艾斯蒂嗯蟹 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
想做一个类似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;
}
...全文

相关推荐

通过函数指针调用C++非静态成员函数

通过函数指针调用C++非静态成员函数通过函数指针调用C++非静态成员函数

icoding

C++静态成员函数不能调用非静态成员变量(详解)

下面小编就为大家带来一篇C++静态成员函数不能调用非静态成员变量(详解)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

weixin_38656395

C++静态成员函数访问非静态成员的几种方法

大家都知道C++中类的成员函数默认都提供了this指针,在非静态成员函数中当你调用函数的时候,编译器都会“自动”帮你把这个this指针加到函数形参里去。当然在C++灵活性下面,类还具备了静态成员和静态函数,即 class A { public: static void test() { m_staticA += 1; } private: static int m_staticA; int m_a };   此时你的test函数只能去访问m_staticA成员,而不能去访问m_a。同学可能会问,这算什么问题?问题都是在应用场景中才能体现的,我一开始也是不以为意,直到我遇

weixin_38626179

C++非静态成员函数完全可以作为线程函数

一般地,线程要读写类的私有成员变量,只有两种方法:将全局函数声明为类友元friend,或者使用静态的成员函数static。那非静态的成员函数呢?一般地方都说的是,不行,做不了。。。为什么不行?都是代码区的代码,static就行,我就不行,歧视我???本例就是自己的研究成果,使用非静态的成员函数作为线程函数,还能修改类的非静态的数据成员。

baidu_32554385

C++获取类的成员函数的函数指针详解及实例代码

主要介绍了C++获取类的成员函数的函数指针详解及实例代码的相关资料,需要的朋友可以参考下

weixin_38552083
评论 4
收藏 已收藏
分享
返回顶部
C艾斯蒂嗯蟹
C++ 语言 65,214 成员 250,514 内容