C ++类抽象:派生类(构造函数有参数)和基类(构造函数不带参数)之间没有可行的转换]]

问题描述 投票:0回答:1

我有一个抽象类Handle(),其中包含handle()方法(以及其他方法)。此类实施了多次,每个类别以不同的方式处理不同类型的数据(存储为字节),例如

class BaseHandle
{
   virtual void handle(uint8_t *ptr, uint8_t data_size) = 0;
}

class DerivedHandleA : BaseHandle 
{
   void handle(uint8_t *ptr, uint8_t data_size)
   {
      //DO THINGS WITH DATA OF KIND "A"
   }
}


class DerivedHandleB : BaseHandle 
{
   void handle(uint8_t *ptr, uint8_t data_size)
   {
      //DO THINGS WITH DATA OF KIND "B"
   }
}

我的问题是,在处理某些类型的数据时,handle()方法需要访问其他类的实例以调用其成员函数,通常我会通过构造函数传递这些成员函数,因此当前我的代码如下:

class DerivedHandleC : BaseHandle 
{
private:
   HelperClass helper;

   void handle(uint8_t *ptr, uint8_t data_size)
   {
      //DO THINGS WITH DATA OF KIND "C" WITH FUNCTIONS FROM helper
   }

public:
   DerivedHandleC(HelperClass helper) : BaseHandle() helper(helper){};
}

出现问题是因为我有一个std :: vector,它包含Handler类的每个实例,每次获取数据以查找正确的处理程序并继续发送数据时,该实例都会进行迭代。这对于不带参数的DerivedHandle可以很好地工作,但是对于带参数的构造函数,当将其推入向量时,我会收到一个no viable conversion from 'DerivedHandleC' to 'BaseHandle',这是可以理解的。

我的问题是,应该怎么做,而不要通过构造函数传递所需的参数?我宁愿不要简单地将相同的参数添加到不需要它们的所有派生类中,尽管我知道这将解决我的编译错误。


编辑

根据要求添加std :: vector代码:

声明

   typedef std::vector<std::unique_ptr<BaseHandler>> HandlerVec;
   HandlerVec handlers;

推回方法

registerHandler(std::unique_ptr<BaseHandler> handler)
{
   handlers.push_back(std::move(handler));
}

回推的示例调用

registerHandler(std::make_unique<DerivedHandleA>());
registerHandler(std::make_unique<DerivedHandleAC>(helper));

我有一个抽象类Handle(),其中包含handle()方法(以及其他方法)。此类被实施多次,每个类别在...

c++ constructor interface virtual
1个回答
0
投票

与使用class声明的类类型相比,使用struct关键字声明的类类型默认具有私有继承。

© www.soinside.com 2019 - 2024. All rights reserved.