将容器中的基类向下转换为派生类

时间:2014-01-26 00:07:03

标签: c++ stl casting unique-ptr dynamic-cast

我先显示我的代码然后解释我的问题:

std::vector<std::unique_ptr<SGUIObject> > m_objects;

const std::unique_ptr<SGUIObject>& SGUIManager::getObject(const std::string& object_name)
    {
        for (auto const& iter : m_objects)
        {
            if (iter.get()->getObjectName() == object_name)
                return iter;
        }
    }

//SButton is derived from SGUIObject
//m_clicked is a boolean member in SButton (private)

//isClicked is a public member method of SButton
const bool isClicked() const { return m_clicked; }

if (dynamic_cast<SButton>(SSceneManager::getGUIManager().getObject("testbutton").isClicked()))
            std::cout << "Clicked!" << std::endl;

我只是从几个不同的文件中复制粘贴,所以当它们放在一起时看起来很奇怪。无论如何,我正在尝试做的是从SGUIObject转发到SButton并在if / else循环中调用isClicked()。当我执行当前代码时,Code :: Blocks会给我这个错误:

错误:'const class std :: unique_ptr'没有名为'isClicked'的成员|

我感觉我有轻微的语法问题,如果有人向我解释,我会非常感激。

谢谢!

2 个答案:

答案 0 :(得分:2)

我认为你的意思是:

dynamic_cast<SButton*>(SSceneManager::getGUIManager().getObject("testbutton").get())->isClicked()

您想在isClicked的结果上致电dynamic_cast,而不是getObject的结果。

答案 1 :(得分:0)

这一行有几个问题:

if (dynamic_cast<SButton*>(SSceneManager::getGUIManager().getObject("testbutton").isClicked()))

首先SSceneManager::getGUIManager().getObject("testbutton")返回unique_ptr引用。正如编译器所说,unique_ptr没有isclicked方法。为此,您需要使用重载的-> operator来返回基础指针。

其次,即使它奏效了,你也不能dynamic_cast指点一个bool。

您可以执行类似

的操作
if (dynamic_cast<SButton*>(SSceneManager::getGUIManager().getObject("testbutton").get())->isClicked) ...

虽然您可能希望将它分成2行,以确保dynamic_cast不会为您提供NULL指针。

SBButton* button = dynamic_cast<SButton*>(SSceneManager::getGUIManager().getObject("testbutton").get());
if (button && button->isClicked()) ...