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 -&gt;* and .*。或者也许使用std::bind 只是多态的一个简单例子 “这只是多态性的一个简单例子”——不,不是。多态性的简单示例将使用简单的指向接口的指针IAnimal* p 并调用p-&gt;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&lt;IAnimal*&gt; vec;,然后使用vec[i]-&gt;eat(i, i);

如果您有不同的实际问题,那么我建议您重新开始一个新问题,这是您尝试解决的场景的一个更现实的变体。

【讨论】:

再次感谢您的解释 涨了(太好了)。

以上是关于C ++回调数组[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

Glut,不同线程C ++中的不同上下文[关闭]

va_list 在 C 和 C++ 之间是不是不兼容? [关闭]

Google Maps API v3 infowindow 关闭事件/回调?

JavaScript DOM API 记录在哪里? [关闭]

从内存中读取图像,知道指向内存的指针。 VC++ [关闭]

layer.js子窗口关闭并传数据到父窗的方法