具有类私有成员和函数指针的继承结构

Posted

技术标签:

【中文标题】具有类私有成员和函数指针的继承结构【英文标题】:inherited structures with class private memers with function pointers 【发布时间】:2015-10-16 00:16:40 【问题描述】:

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

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

错误:无法转换 'void (Sample::)(Sample::sample_call_arg_s)' 到'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;

改写:我想要一个自包含的类,它将包含一个 将根据分配给的枚举运行的类方法列表 他们在一个线程中。我想抽象出这个想法,以便我可以执行 不同场景下的类似操作。

【问题讨论】:

你有什么问题? 我知道当您从 C 转换时这并不容易,但通常在 C++ 中有更好的函数指针替代方案。我真的不明白你在问什么,而且没有更多的上下文,(尽管如果你不能提供细节我可以理解),很难看出这是如何适应的,但是你可以使用一些设计模式来提供帮助有了这个,并且使用模板或 std::function 可能会产生更清洁、更可维护的代码。 你的 typedef 和你的原型是不同的,并且参数不是协变的(即你的函数必须接受任何call_arg_s,而不仅仅是一个子类型的实例)。 【参考方案1】:

这里要注意的重要一点是,带有签名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* 所以它必须有一个。恐怕我现在太累了,无法提出解决方案,但我会在早上尝试看看,正如我在评论中所说,可能有更好的方法来做到这一点。

【讨论】:

我们是否使用多态性,因为子类是(将是,这就是我计划的)一种超类? 所以,如果我理解正确,你想要一个类,如果给定另一个类,可以将该类的成员函数与枚举值相关联,从而给出枚举、对象和参数列表这个类将转身并调用另一个类的函数。这个新类是分配枚举还是在外部完成?如果您希望在运行时添加函数,则需要使用整数。所有函数都采用相同的参数类型吗?如果不是,这将是可能的,但更复杂,您需要决定运行时或编译时类型检查。 如果处理可以从对象内执行的函数指针,但在将它们组合起来创建线程工作者时遇到问题(使用较旧的 c++ 代码库没有线程库),我正在尝试这种方式。我找到了另一个解决方案,并认为我试图做的事情在 C++ 中是不可能的。

以上是关于具有类私有成员和函数指针的继承结构的主要内容,如果未能解决你的问题,请参考以下文章

为啥我可以通过指向派生对象的基类指针访问派生私有成员函数?

c++重用和模板

类的内存结构

C++|详解类成员指针:数据成员指针和成员函数指针及应用场合

不同类的成员函数指针的C++映射

C++ 中具有公共继承的虚函数和私有成员