Создание списка абстрактного базового класса для заполнения унаследованными объектами - PullRequest
0 голосов
/ 17 марта 2020

Я хочу создать список, который может содержать каждый объект, который я кидаю в него, при условии, что они имеют один и тот же базовый класс ABSTRACT. Вот пример кода того, как я хочу достичь этого.

#include <iostream>
#include <memory>
#include <list>

class Observer
{
public:
  virtual void update() = 0;
};


class RequestStateObserver
{
public:
void registerObserver(std::shared_ptr<Observer> o){
  observerList.push_back(o);
}
private:
std::list<std::shared_ptr<Observer>> observerList;  
};

class RestRequestCreator :Observer
{
  void update() override;
};
void RestRequestCreator::update()
{
  std::cout<<"RestRequestCreator::update()";
}

class dbHandler :Observer
{
  void update() override;
};
void dbHandler::update() {
  std::cout<<"dbHandler::update()";
}

int main()
{
 RestRequestCreator rrc;
 RequestStateObserver rso;
 dbHandler dbhandler;
 std::shared_ptr<RequestStateObserver> stateObserver;
 std::shared_ptr<RestRequestCreator> rr_ptr = std::make_shared<RestRequestCreator>(rrc);
 rso.registerObserver(rr_ptr);
 rso.registerObserver(std::make_shared<Observer> (dbhandler));
}

o->registerObserver(std::make_shared<Observer> dbhandler) скажет мне, что я не могу создать Observer, поскольку это абсолютный класс, который имеет смысл, но

o->registerObserver(rr_ptr) скажет мне, что он не может конвертировать std::shared_ptr<Observer> в std::shared_ptr<RestRequestCreator>

В настоящий момент я не уверен, как решить эту проблему или что именно я должен попробовать дальше. Помогут ли мне шаблоны? Если я прав, они просто позволят мне добавить как можно больше объектов ОДНОГО дочернего класса в мой Список, если это не так, пожалуйста, сообщите мне, и я перечитал бы шаблоны снова.

Ответы [ 2 ]

2 голосов
/ 17 марта 2020

Преобразование завершается неудачно, поскольку Observer является частной базой RestRequestCreator и недоступно.

Вам потребуется использовать наследование publi c для компилятора, чтобы неявно преобразовать из производного класса на базу:

class RestRequestCreator :public Observer

Это решает непосредственную проблему, но оставляет проблемы с make_shared<Observable> на следующей строке.

0 голосов
/ 17 марта 2020

Также: должен ли наблюдатель быть совладельцем наблюдателя? В общем, это было бы не так. Поэтому вместо этого используйте обычные указатели.

#include <list>
#include <iostream>

using std::cout;

class Observer
{
public:
  virtual void update() = 0;
};

class ConcreteObserver : public Observer
{
public:
    void update() override { 
        cout << "ConcreteObserver noticed update\n";}
};

class OtherKindConcreteObserver : public Observer
{
public:
    void update() override {
        cout << "OtherKindObserver noticed update\n";
    }
};

class Subject
{
public:
    void registerObserver( Observer* o) {
        observerList.push_back( o);
    }

    void signalObservers() {
        for ( auto observer : observerList)
            observer->update();
    }
private:
    std::list<Observer*> observerList;  
};


int main() {
    ConcreteObserver           observer1;
    OtherKindConcreteObserver  observer2;
    Subject                    subject;

    subject.registerObserver( &observer1);
    subject.registerObserver( &observer2);

    subject.signalObservers();

    return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...