【问题标题】:Creating List of abstract base class to fill with inherited objects创建抽象基类列表以填充继承的对象
【发布时间】:2020-03-17 16:13:24
【问题描述】:

我想创建一个列表,只要它们共享相同的 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-&gt;registerObserver(std::make_shared&lt;Observer&gt; dbhandler)会告诉我我不能创建 Observer,因为它是一个完全有意义的抽象类,但是

o-&gt;registerObserver(rr_ptr) 会告诉我它无法将 std::shared_ptr&lt;Observer&gt; 转换为 std::shared_ptr&lt;RestRequestCreator&gt;

目前我不确定如何解决此问题或下一步我应该尝试什么。 模板对我有帮助吗?如果我是正确的,他们只会允许我将尽可能多的 ONE 子类的对象放入我的列表中,如果这是错误的,请告诉我,我将再次重新阅读模板。

【问题讨论】:

  • @molbdnilo 代码现在会产生我描述的错误。通过注释掉两个registerObserver 函数调用代码是可编译的
  • 我很确定您的编译器实际上提到了相反的转换。

标签: c++ list inheritance polymorphism


【解决方案1】:

转换失败,因为ObserverRestRequestCreator 的私有基址,无法访问。

您需要使用公共继承,编译器才能将派生类隐式转换为基类:

class RestRequestCreator :public Observer

这解决了当前的问题,但将make_shared&lt;Observable&gt; 的问题留在了下一行。

【讨论】:

  • 第二行只是另一种方法......我现在感觉有点脑死。谢谢你这实际上是正确的答案,我想我有点太习惯java了
【解决方案2】:

另外:观察者是否应该共同拥有观察者?一般来说,情况并非如此。因此,请改用常规指针。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-12-30
    • 1970-01-01
    • 1970-01-01
    • 2021-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多