0

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(); 
} 
+0

무엇이 질문입니까? 코드 : tl; dr : [boost :: signals2] (http://www.boost.org/doc/libs/1_57_0/doc/html/signals2.html) 사용을 고려하십시오. – user1810087

+0

또는 std :: function – paulm

+0

회원에 대한 포인터가 있습니다. 당신은 더 이상 * 어딘가에 * 그들을 호출하는 개체가 있습니다. 테스트 초기화에서 할당을 유출하는 대신 Methinks가 절약하는 것이 도움이 될 수 있습니다. [연산자'-> *'및'. *'] (http://en.cppreference.com/w/cpp/language/operator_member_access)를 참조하십시오. 또는 아마도 ['std :: bind'] (http://en.cppreference.com/w/cpp/utility/functional/bind) – WhozCraig

답변

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 
     } 
    } 

은 작동하지 않습니다. 따라서 이것이 잠재적으로 eat 함수를 호출 할지라도 숨겨진 인수로 전달되는 동물 개체가 없습니다. 따라서이 코드는 절대로 서면으로 작동하지 않습니다.

기술적으로 함수 포인터를 통해 가상 함수를 호출 할 수는 있지만 일반적으로 나쁜 코드라고합니다. 즉, 나쁜 코드입니다.

설명 된 문제에 대한 제 제안은 std::vector<IAnimal*> vec;을 사용하고 vec[i]->eat(i, i);을 사용하는 것입니다.

다른 실제 문제가있는 경우 해결하려는 시나리오의보다 현실적인 변형이 새 질문으로 다시 시작하는 것이 좋습니다.

+0

다시 한번 설명해 주셔서 감사합니다. – CrSe

+0

득점 (너무 좋지 않음). – WhozCraig