【问题标题】:vector of class that inherits from class template从类模板继承的类向量
【发布时间】:2018-01-18 09:06:23
【问题描述】:

我有一个这样的模板类

template <class DatasetType>
class DataHandler
{
    void Action(DatasetType* Test)
    {
       //
    }
}

然后我需要将这个模板类存储在一个数组中

class Factory{
    vector<DataHandler<BaseData>*> availableData;
    void SetAvailableData(vector<DataHandler<BaseData>*> i_availableData)
    {
    this->availableData= i_availableData;
    }
}

BaseData 是一个基类

class BaseData
{
virtual void HandleData() = 0;
}

我的问题是,当我尝试将某些东西放入继承自 BaseData 的数组中时

class DataType1: public BaseData 
{
void HandleData() override;
}

...

vector<DataHandler<DataType1>*> arrayWithData = vector<DataHandler<DataType1>*>();
factory->SetAvailableData(arrayWithData );

...

错误 E0312“没有合适的用户定义的从 std::vector * > 到 std::vector * >

的转换

我认为使用继承的真正原因是不需要转换。在 BaseData[] 的数组中,我可以存储 DataType1? DataHandler 需要能够“处理”任何数据类型, 但在这种特定情况下,Factory 需要能够存储仅从 BaseData 继承的所有内容。 我究竟做错了什么?我该如何解决这个问题?

-编辑-

好的,基本上我想要的是DataHandler只是一个基类,我需要创建从这个基类继承的不同DataHandler。

BaseData 包含对通用数据的基本操作,我需要创建从 BaseData 继承的其他数据类型

我最初的问题是,当我想使用 DataHandler 时,我就这样使用它

DataType1* dataType = new DataType1();
handler->Start(dataType);


void DataHandler2::Start(DataBase* data)

     { 
    DataType1* newData= dynamic_cast<DataType1*>(data);
    }

在我的处理程序中,我总是必须进行动态转换,而且我必须在 DataHandlers 的每个函数中进行动态转换,这看起来真的很糟糕 我试图通过使用类模板来解决这个问题

【问题讨论】:

  • “我可以在 BaseData[] 数组中存储 DataType1?” - 不可以。您只能将 BaseData 存储在 BaseData 数组中。
  • 我是不是把它和别的东西搞混了?我很肯定这就是多态性的工作原理
  • C++ 中的运行时多态性适用于指针或引用。
  • 除了定义该成员函数之外,DataHandler 应该与 DatasetType 做什么?
  • Factory 使用 DataHandler 并且所有继承自 DataHandler 我的问题是我需要一直进行动态转换 void DataHandler2::Start(DataBase* data) { DataType1* newData= dynamic_cast&lt;DataType1*&gt;(data); } 所以我想通过在 DataHandler DataHandler2 中使用类模板来添加它处理的类型继承自 DataHandler

标签: c++ arrays templates inheritance


【解决方案1】:

尽管DataType1 继承自BaseData(并且来自前者的指针和引用可以隐式转换为指向后者的指针和引用),DataHandler&lt;DataType1&gt;DataHandler&lt;BaseData&gt; 是不相关的类型。

如果不提供用户定义的转换,您无法将 DataHandler&lt;BaseData&gt; 转换为 DataHandler&lt;DataType1&gt; 或从 DataHandler&lt;DataType1&gt; 转换。完成此操作后,由于您无法定义从/到std::vector&lt;DataHandler&lt;BaseData&gt;&gt; 到/从std::vector&lt;DataHandler&lt;DataType1&gt;&gt; 的转换,因此您需要为最后一步编写一个转换函数。

【讨论】:

    猜你喜欢
    • 2018-05-23
    • 1970-01-01
    • 2018-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多