Я новичок в C++, но много лет работал с C#, однако здесь это мне не помогает! :)
Моя проблема: у меня есть класс Actor
, из которого Ball
и Peg
вытекают из игры для iphone с объективом, над которой я работаю. Поскольку я проверяю конфликты, я хочу установить экземпляр Ball
и Peg
соответствующим образом в зависимости от фактического типа среды выполнения actorA
или actorB
. Мой код, который проверяет это следующим образом:
// Actors that collided
Actor *actorA = (Actor*) bodyA->GetUserData();
Actor *actorB = (Actor*) bodyB->GetUserData();
Ball* ball;
Peg* peg;
if (static_cast<Ball*> (actorA)) { // true
ball = static_cast<Ball*> (actorA);
}
else if (static_cast<Ball*> (actorB)) {
ball = static_cast<Ball*> (actorB);
}
if (static_cast<Peg*> (actorA)) { // also true?!
peg = static_cast<Peg*> (actorA);
}
else if (static_cast<Peg*> (actorB)) {
peg = static_cast<Peg*> (actorB);
}
if (peg != NULL) {
[peg hitByBall];
}
Как только ball
и peg
установлены, я приступаю к запуску метода hitByBall
(цель c).
Моя проблема действительно заключается в процедуре литья Ball
отлично отбрасывает из actorA
; первый оператор if (static_cast<>)
вмешивается и устанавливает указатель ball
соответствующим образом.
Второй шаг — присвоить peg
соответствующий тип. Я знаю, что peg
должен быть типом Peg
, и я ранее знал, что это будет actorB
, однако во время выполнения, определяя типы, я был удивлен, обнаружив, что на самом деле вмешался третий оператор if (static_cast<>)
и установил это, это оператор if должен был проверить, был ли actorA
Peg
, а мы уже знаем, что actorA
это Ball
! Почему он встал здесь, а не в четвертом операторе if
?
Единственное, что я могу предположить, это то, что кастинг работает иначе, чем в С#, и он обнаруживает, что actorA
, который на самом деле имеет тип Ball
, происходит от Actor
, а затем, когда выполняется static_cast<Peg*> (actorA)
, он обнаружил, что Peg
также происходит от Actor
, так что это допустимо тестовое задание? Все могло сводиться к тому, что я неправильно понял использование static_cast
. Как я могу достичь того, что мне нужно? :)
Меня действительно беспокоит то, что мне кажется длинной попыткой перебора здесь с кучей нелепых утверждений if
. Я уверен, что есть более элегантный способ добиться простого приведения к Peg
и приведения к Ball
в зависимости от фактического типа, содержащегося в actorA
и actorB
.
Надеюсь, кто-то там может помочь! :) Большое спасибо.
Ball
илиPeg
. Это может измениться. - person GONeale   schedule 22.05.2010static_cast
так не работает. Вы ошибочно принимаетеstatic_cast
заdynamic_cast
. - person sellibitze   schedule 22.05.2010