我有一个抽象类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()方法(以及其他方法)。此类被实施多次,每个类别在...
与使用class
声明的类类型相比,使用struct
关键字声明的类类型默认具有私有继承。