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