Я пытаюсь сохранить ссылки на объекты, которые наследуются от вложенного абстрактного базового класса, внутри std::set
во внешнем классе.
Позвольте мне сначала показать вам код, так как я думаю, что это намного яснее :
Интерфейс Class.h:
#ifndef Class_H_
#define Class_H_
#include <set>
#include <memory>
class Class
{
public:
class AbstractBase;
private:
std::set< std::shared_ptr<AbstractBase>> set;
public:
Class();
~Class();
void add(AbstractBase& object);
};
#endif
Интерфейс Abstract.h:
#ifndef ABSTRACT_H_
#define ABSTRACT_H_
#include "Class.h"
class Class::AbstractBase
{
friend class Class;
public:
virtual ~AbstractBase();
private:
virtual void foo(int in) = 0;
};
#endif
Интерфейс Derived.h:
#ifndef DERIVED_H_
#define DERIVED_H_
#include "Class.h"
#include "AbstractBase.h"
class Derived : private Class::AbstractBase
{
public:
~Derived() override;
private:
void foo(int in) override;
};
#endif
add . cc реализация:
#include "Class.h"
#include "AbstractBase.h"
void Class::add(AbstractBase& object)
{
// create a shared pointer to object
// and insert it in the set
set.insert(std::make_shared<AbstractBase>(object)); // <-- this is where it fails
}
Таким образом, я хотел бы иметь несколько различных производных объектов, все наследуемые от AbstractBase
, которые должны храниться вместе в контейнере std::set
. Компиляция не удалась из-за чисто виртуальной функции. Сначала я не использовал std::shared_ptr
и думал, что это является причиной сбоя, я нашел этот SO ответ, предлагающий использовать std::shared_ptr
вместо этого. Я все еще получаю ошибку компиляции в Class::add
, потому что AbstractBase::foo
чисто, но я думал, что std::shared_ptr
решит эту проблему?
Я нашел похожие вопросы, но ничего, что не помогло мне решить мои специфические c проблема. Может ли кто-нибудь объяснить мне, что я делаю не так?
Спасибо.
РЕДАКТИРОВАТЬ: Wow! Спасибо за информативные ответы, мне потребуется некоторое время, чтобы полностью понять их все и посмотреть, что лучше для меня. Я обновлю этот вопрос, как только закончу!