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

标签 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”的成员|

我感觉我在语法上有一点问题,如果有人能向我解释一下,我将不胜感激。

谢谢!

最佳答案

我想你的意思是:

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

您想在 dynamic_cast 的结果上调用 isClicked,而不是 getObject 的结果。

关于c++ - 将容器中的基类向下转换为派生类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21357918/

相关文章:

C++ boost : how to implement session per thread

c++ - STL vector 错误 : Unknown type name

java - 如何在运行时确定列表的内容类型

java - 将 Map<String, String> 传递给需要 Map<String, Object> 的方法

C++ 启动另一个进程的最佳方式?

c++ - QThread 终止和关联

c++ - 写智能指针和指针的泛型代码时,如何获取简单指针?

c++ - 重新排序 C++ 基于映射的集合的有效方法

c++ - 为什么枚举不能用作此 vector 构造函数中的参数?

java - 如何在java中转换之前检查类型