2014-01-26 75 views
0

我會先顯示我的代碼,然後再解釋我的問題:溯造型在容器基類派生類

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'的成員|

我有一種感覺,我有一個輕微的語法問題,如果有人向我解釋,我會非常感激。

謝謝!

+0

你的括號是錯誤的。 – OlivierH

回答

2

我想你的意思:

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

你想打電話isClickeddynamic_cast,不是getObject結果的結果。

0

此行有幾個問題:

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

首先SSceneManager::getGUIManager().getObject("testbutton")返回unique_ptr參考。正如編譯器所說,unique_ptr不是一個isclicked方法。爲此,您將需要使用重載的-> operator來返回基礎指針。

二,即使它工作,也不能將dynamic_cast布爾指向一個指針。

你可以做類似

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()) ...