尝试将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的自包含类 将根据分配给的枚举运行的类方法列表 他们在一个线程中。我想抽象出这个想法,这样我就能表现出来 在不同场景下的类似操作。
答案 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 *所以它必须有一个。我现在觉得我太累了想出一个解决方案,但是我会在早上试着看,正如我在评论中说的那样,可能会好一些。这样做的方式。