I am developing a class system to be able to compare data but but there are some error due to unique_ptr that i don't understand.
I believe this is mainly because of the pure virtual clone method of "Valeur"
Valeur.hh :
#pragma once #include <map> #include <list> #include <string> #include <memory> namespace common { class Valeur { public: //virtual bool operator==(Valeur const& v) const = 0; virtual std::unique_ptr<Valeur> clone() const = 0; }; class Objet : public Valeur{ private: std::map<std::string,std::unique_ptr<Valeur>> _valeurs; bool contientValeur(std::string key,Valeur const& Valeur)const; public: Objet() = default; Objet( Objet const& o); void ajouterValeur(std::string key,std::unique_ptr<Valeur> v); std::unique_ptr<Valeur> clone () const override; }; class Boolleen : public Valeur { //problem private: bool _b; public: Boolleen (bool const& b); std::unique_ptr<Valeur> clone () const override = 0; }; class Null : public Valeur { // problem public : std::unique_ptr<Valeur> clone () const override; }; }
Valeur.cc: the error says : "invalid new-expression of abstract class type' common :: Boolleen "
however none of the classes are abstract
#include "Valeur.hh" using namespace common; bool Objet::contientValeur(std::string key, const Valeur &v) const { auto cherch = _valeurs.find(key); if(cherch == _valeurs.end()) return false; else if (cherch->second->operator==(v)) return true; return false; } Objet::Objet(const Objet &o) { for ( auto const& e : o._valeurs) { _valeurs.clear(); _valeurs.insert(std::pair<std::string,std::unique_ptr<Valeur>>(e.first,e.second->clone())); } } void Objet::ajouterValeur(std::string key,std::unique_ptr<Valeur> v) { auto cherch = _valeurs.find(key); if(cherch == _valeurs.end()) { _valeurs[key] = std::move(v); } else return throw "Erreur : ajout de clé multiple"; } std::unique_ptr<Valeur> Objet::clone() const { return std::make_unique<Objet>(*this); } Boolleen::Boolleen(const bool &b) : _b(b) {} std::unique_ptr<Valeur> Boolleen::clone() const { return std::make_unique<Boolleen>(*this); } std::unique_ptr<Valeur> Null::clone() const { return std::make_unique<Null>(*this); }
error :
invalid new-expression of abstract class type 'common::Boolleen' unique_ptr.h 857
https://stackoverflow.com/questions/65417666/invalid-new-expression-of-abstract-class-type-problem-with-unique-ptr December 23, 2020 at 08:39AM
没有评论:
发表评论