C++ C++;类模板内的纯虚拟类

C++ C++;类模板内的纯虚拟类,c++,C++,我试图将一个纯虚拟类(数据源)传递到一个自定义数据结构(AVLTree)中,该数据结构是一个类(dataManager)的成员;纯虚拟类既有子实时也有模拟,但我不知道如何实例化这两个子类: AVLTree.h: public: T& info; AVLnode* left; AVLnode* right; unsigned int leftHeight; unsigned int rightHeight;

我试图将一个纯虚拟类(数据源)传递到一个自定义数据结构(AVLTree)中,该数据结构是一个类(dataManager)的成员;纯虚拟类既有子实时也有模拟,但我不知道如何实例化这两个子类:

AVLTree.h:

public:
        T& info;
        AVLnode* left;
        AVLnode* right;
        unsigned int leftHeight;
        unsigned int rightHeight;
    public:
        AVLnode(T&);
    };

    template <typename T>
    class AVLTree {
    private:
        AVLnode<T>* startNode;
    public:
        AVLTree(T&);
DataManager.h:

class DataManager {
    private:
        DataStruct::AVLTree<DataSource*> dataSource;
}
我尝试将其作为一个函数来确定应该返回的类型,但仍然遇到相同的问题。有人知道如何解决这个问题吗,或者可以给我一些提示吗

非常感谢您抽出时间

编辑:
我尝试了以下两种解决方案:

  • 添加新关键字
  • 创建工厂模式
但是,我仍然收到警告:
操作数类型不兼容(Data::RealTime*和Data::Simulation*)

以下是更新的代码:

dataSource(filetype == Data::FileType::RealTime ? new Data::RealTime(loc + name) : new Data::Simulation(loc+name))
// error occured in - new Data::Realtime  : (<-here) new Data::Simulation...  
dataSource(filetype==Data::filetype::RealTime?新数据::RealTime(loc+name):新数据::模拟(loc+name))
//错误发生在新数据::RealTime:(带代码>数据::实时(LOC+Name)< /Cord> >您试图取一个临时对象的地址,一个将立即被破坏(使指针无效)。C++中,您不能简单地获取该对象的地址。
您需要做的是使用
new
创建一个对象,如
newdata::RealTime(loc+name)

以后不要忘记删除对象



话虽如此,更好的解决方案是根本不使用“原始”非拥有指针,而是使用智能指针,如。

Data::RealTime(loc+name)<代码>看起来像是临时对象。在C++中使用临时地址不是一个好主意,而且不合法。您可能需要动态分配对象。建议在智能指针和工厂模式上读取。您好!谢谢您的响应。在实例化之前,我添加了新关键字;但是我仍然在尝试。l get错误操作数类型不兼容(Data::RealTime*和Data::Simulation*)。我不明白为什么我不能为此使用三元运算符…@TanSaint问题是三元表达式(您使用的条件表达式)的两条路径必须是可直接转换的。类型:代码>模拟> *>代码> >代码>实时** /代码>都可以转换为它们的通用代码>数据源*/Case> BASE,但是C++不允许两个分支被转换。简单的解决方案是将两个结果都转换成<代码>数据源*/COD>。更好的解决方案是调用FUNC。它返回一个
数据源*
,并使用普通的
if-else
进行创建(这也将使您的代码更易于阅读、理解和维护)。
DataManager::DataManager(Data::FileType filetype, const std::string& loc, const std::string& name):
    dataSource(filetype == Data::RealTime ? &Data::RealTime(loc + name)) : &Data::Simulation(loc+name){}
dataSource(filetype == Data::FileType::RealTime ? new Data::RealTime(loc + name) : new Data::Simulation(loc+name))
// error occured in - new Data::Realtime  : (<-here) new Data::Simulation...