【发布时间】: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->registerObserver(std::make_shared<Observer> dbhandler)会告诉我我不能创建 Observer,因为它是一个完全有意义的抽象类,但是
o->registerObserver(rr_ptr) 会告诉我它无法将 std::shared_ptr<Observer> 转换为 std::shared_ptr<RestRequestCreator>
目前我不确定如何解决此问题或下一步我应该尝试什么。 模板对我有帮助吗?如果我是正确的,他们只会允许我将尽可能多的 ONE 子类的对象放入我的列表中,如果这是错误的,请告诉我,我将再次重新阅读模板。
【问题讨论】:
-
@molbdnilo 代码现在会产生我描述的错误。通过注释掉两个
registerObserver函数调用代码是可编译的 -
我很确定您的编译器实际上提到了相反的转换。
标签: c++ list inheritance polymorphism