C ++回调数组

时间:2015-01-10 11:55:26

标签: c++ pointers vector function-pointers member-function-pointers

我在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();
 }

1 个答案:

答案 0 :(得分: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函数,但它没有作为隐藏参数传递的动物对象。因此,此代码永远不会按照书面形式工作。

技术上可以通过功能指针调用虚函数,但通常我会说这是一种“难闻的气味”#34;&#34; (换句话说,是坏代码的标志)。

我对所描述问题的建议是使用std::vector<IAnimal*> vec;,然后使用vec[i]->eat(i, i);

如果您遇到不同的实际问题,那么我建议您使用新问题重新启动是您尝试解决的方案的更现实的变体。