带有函数指针的类私有memers的继承结构

时间:2015-10-16 00:16:41

标签: c++ class struct function-pointers

尝试将C代码的圆顶重写为C ++,试图抽象出事物,以便我们能够以类似的方式测试许多不同类型的功能。 live on coliru

尝试形成具有子类结构的函数指针,以便我可以抽象出相似特征的机制。我不能详细说明,我在这里附上了示例程序。任何想法赞赏。是否可以编译此代码而不会出现错误

  

错误:无法转换' void(Sample :: )(Sample :: sample_call_arg_s )'   to' Sample :: sampleFuncType {aka void(Sample :: )(call_arg_s )}'

#include <iostream>
#include <string>
#include <vector>
#include <map>
using namespace std;

struct call_arg_s
{
   string            time_stamp;         // when the call was made
   string            func_name;      // when the call was made
};

class Sample {
public:
      Sample();
      ~Sample();
    void initCallMap();
private:
   typedef void (Sample::*sampleFuncType)(call_arg_s*);
   struct sample_call_arg_s : call_arg_s
   {
      sampleFuncType func_pointer;
      sample_call_arg_s()
      {
         func_pointer = NULL;
      }
    };
    std::map<int, sample_call_arg_s> call_map;

    void sampleMethod( sample_call_arg_s* );
};

void Sample::initCallMap() 
{
   call_map[0]               = sample_call_arg_s();
   call_map[0].func_pointer  = &Sample::sampleMethod;
   call_map[0].func_name     = string("sampleMethod");
}

int main()
{
    Sample* sample = new Sample();
    sample->initCallMap();
    return 0;
}
  

改述:我想要一个包含a的自包含类   将根据分配给的枚举运行的类方法列表   他们在一个线程中。我想抽象出这个想法,这样我就能表现出来   在不同场景下的类似操作。

1 个答案:

答案 0 :(得分:0)

这里需要注意的重点是,具有签名void f1(Base*)的函数与具有签名void f2(Derived*)的函数非常不同 - 它们不兼容。在以下内容中:

Base b;
Derived d;
f2(&b); //illegal
f1(&d);

非法陈述有点像你正在尝试做的事情。接受Base *的函数的函数指针不能分配给接受Derived *的函数的地址,因为函数指针可能传递给不是Derived的Base对象。同样,我也不认为它可以反过来工作,也就是说,将接受Derived *的函数指针分配给接受Base *的函数的地址,因为Derived指针可能必须先调整。如果需要,编译器会在最后一行调用函数之前插入代码来调整指向d的指针。 f1需要一个Base *所以它必须有一个。我现在觉得我太累了想出一个解决方案,但是我会在早上试着看,正如我在评论中说的那样,可能会好一些。这样做的方式。