C++에서 콜백 벡터를 만드는 데 문제가 있습니다. 하나의 함수와 그 인터페이스를 구현하는 2 개의 클래스가있는 인터페이스가 있습니다. 내 프로그램의 다른 부분에있는 벡터에서이 함수를 호출하고 싶다.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; dr : [boost :: signals2] (http://www.boost.org/doc/libs/1_57_0/doc/html/signals2.html) 사용을 고려하십시오. – user1810087
또는 std :: function – paulm
회원에 대한 포인터가 있습니다. 당신은 더 이상 * 어딘가에 * 그들을 호출하는 개체가 있습니다. 테스트 초기화에서 할당을 유출하는 대신 Methinks가 절약하는 것이 도움이 될 수 있습니다. [연산자'-> *'및'. *'] (http://en.cppreference.com/w/cpp/language/operator_member_access)를 참조하십시오. 또는 아마도 ['std :: bind'] (http://en.cppreference.com/w/cpp/utility/functional/bind) – WhozCraig