gpt4 book ai didi

c++ - 派生类(构造函数有参数)和基类(构造函数没有参数)之间没有可行的转换

转载 作者:行者123 更新时间:2023-12-02 09:56:26 26 4
gpt4 key购买 nike

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

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


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


class DerivedHandleB : public 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){};
}

出现问题是因为我有一个包含 Handler 类的每个实例的 std::vector ,每次我获取数据以找到正确的处理程序并发送数据时都会迭代它。这适用于不带参数的 DerivedHandle,但对于带参数的构造函数,我会收到 no viable conversion from 'DerivedHandleC' to 'BaseHandle'将它推到我的 vector 时,这是可以理解的。

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

编辑

根据要求添加 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<DerivedHandleC>(helper));

最佳答案

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

这是一个例子:

struct A {};

struct B : A {
// inherit publicly from A, the outside world can see the inheritance graph
};

class C : A {
// privately inherit, the outside world cannot see the inheritance
};

要公开继承,请使用 struct或使用带有说明符的类来覆盖默认行为:
class D : public A {
// inherit publicly
};

关于c++ - 派生类(构造函数有参数)和基类(构造函数没有参数)之间没有可行的转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59752969/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com