C ++回调数组[关闭]
Posted
技术标签:
【中文标题】C ++回调数组[关闭]【英文标题】:C++ Array of callbacks [closed] 【发布时间】:2015-01-10 11:55:26 【问题描述】:我在 C++ 中创建回调向量时遇到了一些麻烦。 我有一个接口,它有一个函数和两个实现该接口的类。我想从程序其他部分的向量中调用此函数。
我只需要那个函数,所以我不想存储指向整个对象的指针
这是我想做的一个简单示例:
#include <iostream>
#include <vector>
class IAnimal
public:
IAnimal();
~IAnimal();
virtual void eat(int,int) = 0;
;
class Dog: public IAnimal
public:
Dog();
~Dog();
virtual void eat(int food, int water)
std::cout<<"Dog: " << food<< " " << water << std::endl;
;
class Cat :public IAnimal
public:
Cat();
~Cat();
virtual void eat(int food, int water)
std::cout << "Cat: " << food << " " << water << std::endl;
;
class Test
private:
std::vector<void (IAnimal::*)(int, int)> vec;
public:
void Init()
IAnimal* dog1 = new Dog();
IAnimal* dog2 = new Dog();
IAnimal* cat3 = new Cat();
//here I want to add callbacks to vec
void(IAnimal::*f)(int, int) = &IAnimal::eat;
(*f)->dog1.eat;//doesn't work
vec.push_back(f);
void RunTest()
for (int i = 0; i < vec.size(); i++)
//here I call the callbacks
vec[i](i, i);//also I don't know how this should be called
;
void main()
Test t;
t.Init();
t.RunTest();
getchar();
【问题讨论】:
有什么问题?代码:tl;博士:考虑使用boost::signals2。 你有指向成员的指针。你最好有一个对象 somewhere 来调用它们。我认为在测试初始化中保存而不是泄漏这些分配可能会有所帮助。 See operators->*
and .*
。或者也许使用std::bind
只是多态的一个简单例子
“这只是多态性的一个简单例子”——不,不是。多态性的简单示例将使用简单的指向接口的指针IAnimal* p
并调用p->eat(...)
,从而根据分配的对象类型p
触发eat()
的适当派生在创作上。不需要指向成员的管理。这是相当不同的。这只是为了您自己的学习还是您遇到的一些学术不适?
有什么理由不能将指向动物的指针存储在向量中,然后调用每个人的 eat
函数?
【参考方案1】:
当你有多态性并使用虚函数时,你需要一个对象。所以你的代码:
void RunTest()
for (int i = 0; i < vec.size(); i++)
//here I call the callbacks
vec[i](i, i);//also I don't know how this should be called
不起作用,因为您传递给回调的 OBJECT 丢失了。因此,尽管这可能会调用 eat
函数,但它没有作为隐藏参数传递的动物对象。因此,这段代码永远不会像写的那样工作。
从技术上讲,通过函数指针调用虚函数是可行的,但通常我会说这是一种“难闻的气味”(换句话说,是坏代码的标志)。
我对所描述问题的建议是使用std::vector<IAnimal*> vec;
,然后使用vec[i]->eat(i, i);
。
如果您有不同的实际问题,那么我建议您重新开始一个新问题,这是您尝试解决的场景的一个更现实的变体。
【讨论】:
再次感谢您的解释 涨了(太好了)。以上是关于C ++回调数组[关闭]的主要内容,如果未能解决你的问题,请参考以下文章
va_list 在 C 和 C++ 之间是不是不兼容? [关闭]
Google Maps API v3 infowindow 关闭事件/回调?