2 votes

Classe virtuelle pure C++ à l'intérieur d'un modèle de classe

J'essaie de passer une classe virtuelle pure (DataSource) dans une structure de données personnalisée (AVLTree) qui est membre d'une classe (dataManager) ; la classe virtuelle pure a deux enfants RealTime et Simulation mais je n'ai pas réussi à trouver comment les instancier tous les deux :

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&);

DataSource.h :

class DataSource {
    public: 
        virtual void readData(std::string&) = 0;
    };
}
class RealTime : public DataSource{
 ...
}

class Simulation : public DataSource{
....
}

DataManager.h :

class DataManager {
    private:
        DataStruct::AVLTree<DataSource*> dataSource;
}

DataManager.cpp :

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){}

J'ai essayé d'en faire une fonction pour déterminer le type qui est censé retourner mais j'ai toujours le même problème. Quelqu'un sait-il comment résoudre ce problème ou peut-il m'indiquer quelques pistes ?

Merci beaucoup pour votre temps.

EDIT :
J'ai essayé les deux solutions ci-dessous avec :

  • ajouter le nouveau mot-clé
  • créer le modèle d'usine

Cependant, je reçois toujours l'avertissement :
les types d'opérandes sont incompatibles (Data::RealTime* et Data::Simulation*) .

voici le code mis à jour :

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...  

Je ne comprends pas pourquoi je suis incapable d'utiliser un opérateur ternaire.

1voto

Joachim Pileborg Points 121221

Avec &Data::RealTime(loc + name) vous tentez de prendre l'adresse d'une temporaire qui sera détruit immédiatement (ce qui rend ce pointeur sans valeur). En C++, vous ne pouvez tout simplement pas prendre l'adresse d'un tel objet.

Ce que vous devez faire est de créer un objet en utilisant new , comme dans new Data::RealTime(loc + name)

N'oubliez pas le delete l'objet plus tard.


Cela dit, une meilleure solution consiste à ne pas utiliser de pointeurs non propriétaires "bruts" du tout, mais d'utiliser plutôt un intelligent pointeur comme std::unique_ptr .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X