"invalid new-expression of abstract class type" unique_ptr的问题?



我正在开发一个能够比较数据的类系统,但由于unique_ptr的原因,出现了一些我不理解的错误。

我相信这主要是因为"虚拟克隆"的纯虚拟克隆方法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:错误显示:"抽象类类型"common::Boolleen"的新表达式无效
但是没有一个类是抽象

#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);
}

错误:

invalid new-expression of abstract class type ‘common::Boolleen’                          unique_ptr.h 857

具有持续问题的第二个最小示例

Valeur.hh

#pragma once
#include <memory>
namespace common {
class Valeur {
public:
virtual bool operator==(Valeur const& v) const =0;
};
class Boolleen : public Valeur {
private:
bool _b;
public:
Boolleen (bool b);
bool operator==(Valeur const& v);
};
}

Valeur.cpp

#include "valeur.h"
using namespace common;
Boolleen::Boolleen(bool b): Valeur(), _b(b) {}
bool Boolleen::operator==(Valeur const& v) {
return true;
}

main.cpp

#include "valeur.h"
int main()
{
common::Boolleen b(true); // DOESN'T WORK ???
return 0;
}

您输入了一个错误:

class Boolleen : public Valeur { //problem
private:
bool _b;
public:
Boolleen (bool const& b);
std::unique_ptr<Valeur> clone () const override = 0;
// TYPO Setting clone() to pure virtual makes Boolleen abstract
};

只要去掉= 0就可以了。

最新更新