具有类私有成员和函数指针的继承结构 试图将C代码的圆顶改写为C++,试图抽象事物,这样我们可以用类似的方式测试许多不同类型的特征。

具有类私有成员和函数指针的继承结构 试图将C代码的圆顶改写为C++,试图抽象事物,这样我们可以用类似的方式测试许多不同类型的特征。 ,c++,class,struct,function-pointers,C++,Class,Struct,Function Pointers,试图形成具有子类结构的函数指针,这样我就可以抽象出类似特性的机制。我不能给出什么的细节,我在这里附上了样本程序。任何想法都值得赞赏。是否可以编译此代码而不出错 错误:无法转换“void(Sample::)(Sample::Sample\u call\u arg\s)” 到“Sample::sampleFuncType{aka void(Sample::)(call_arg_s)}” #包括 #包括 #包括 #包括 使用名称空间std; 结构调用参数 { string time_stamp;//调

试图形成具有子类结构的函数指针,这样我就可以抽象出类似特性的机制。我不能给出什么的细节,我在这里附上了样本程序。任何想法都值得赞赏。是否可以编译此代码而不出错

错误:无法转换“void(Sample::)(Sample::Sample\u call\u arg\s)” 到“Sample::sampleFuncType{aka void(Sample::)(call_arg_s)}”

#包括
#包括
#包括
#包括
使用名称空间std;
结构调用参数
{
string time_stamp;//调用的时间
字符串func_name;//调用时
};
类样本{
公众:
样本();
~Sample();
void initCallMap();
私人:
typedef void(示例::*sampleFuncType)(call_arg_s*);
结构示例调用参数:调用参数
{
sampleFuncType函数指针;
示例调用参数
{
func_指针=NULL;
}
};
std::map调用\ u map;
无效采样方法(采样调用参数*);
};
void Sample::initCallMap()
{
call_map[0]=示例_call_arg_s();
调用映射[0]。func\u指针=&Sample::sampleMethod;
调用映射[0]。func\u name=string(“sampleMethod”);
}
int main()
{
样本*样本=新样本();
sample->initCallMap();
返回0;
}
我希望有一个包含 将基于分配给的枚举运行的类方法列表 把它们放在一根线里。我想把想法抽象出来,这样我就可以表演了 不同场景下的类似操作


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

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

非法声明有点像你想做的。无法将指向接受基*的函数的函数指针指定给接受派生*的函数的地址,因为函数指针可能被传递给非派生的基对象。同样地,我也不认为它是以另一种方式工作的,也就是说,将接受派生*的函数指针分配给接受基*的函数的地址,因为可能必须首先调整派生指针。在调用最后一行中的函数之前,编译器插入代码以调整指向d的指针(如果需要)。f1需要一个基数*,因此它必须有一个基数。恐怕我现在太累了,无法想出一个解决办法,但我会在早上看,正如我在评论中所说的,也许有更好的方法。你的问题是什么?我知道当你从C转换时不是那么容易,但是一般来说C++中有更好的指针替代。我真的不明白你在问什么,没有更多的上下文,(虽然如果你不能提供详细信息,我可以理解),很难看出这是怎么回事,但有一些设计模式可以帮助你做到这一点,使用模板或std::function可能会导致更干净,更易于维护的代码。您的typedef和原型不同,参数也不协变(即,您的函数必须接受任何
调用,而不仅仅是子类型的实例)。我们是否应该使用多态性,因为子类(将是,这正是我计划的)是一种超类?因此,如果我理解正确,您需要一个类,如果给了另一个类,该类可以将该类的成员函数与枚举值相关联,因此给该类提供枚举、对象和参数列表,该类将返回并调用另一个类的函数。这个新类是分配枚举还是在外部完成的?如果希望在运行时添加函数,则需要使用整数。所有函数都采用相同的参数类型吗?如果不是这样,它可能会更复杂,你需要决定运行时或编译时类型检查。我尝试这样做,如果处理函数指针,可以从一个对象内执行,但有问题,能够结合他们创建线程工作者(使用旧的C++代码基础无线程库)。我发现了另一个解决方案,并想我在C++中所做的是不可能的。
Base b;
Derived d;
f2(&b); //illegal
f1(&d);