2014-01-26 3 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 и вызывает isClicked() в цикле if/else. Когда я делаю свой текущий код, Code :: Blocks дает мне эту ошибку:

error: 'const class std :: unique_ptr' не имеет имени с именем 'isClicked' |

У меня такое чувство, что у меня небольшая синтаксическая проблема, и я был бы чрезвычайно благодарен, если бы кто-то объяснил мне это.

Спасибо!

+0

Ваши скобки ошибочны. – OlivierH

ответ

2

Я думаю, что вы имеете в виду:

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

Вы хотите вызвать isClicked на результат dynamic_cast, а не результат getObject.

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()) ... 
Смежные вопросы