Ваше использование static_cast
является проблемой. static_cast
не переопределяет тип переменной: вместо этого он возвращает значение, приведенное к типу, который вы запрашивали.
Type* variable = static_cast<Type*>(variableToCast);
Кроме того, если ваши классы используют полиморфизм, рассмотрите возможность использования dynamic_cast
, который использует (не очень мощную) информационную систему времени выполнения типа C ++.
if (b2DistanceJointDef* def = dynamic_cast<b2JointTypeDef*>(Joint))
{
// if you reach this block, this means Joint is actually a pointer to
// a b2JointTypeDef object; and you may use the `def` variable to access
// its members
}
Еще лучше, если вам нравятся подобные вещи, и если это имеет смысл в вашем дизайне, вы можете рассмотреть полиморфный метод устранения этого переключения типов. Существует широкая дискуссия о том, почему лучше на этом сайте и почти везде избегать явных переключений типов.
Для оператора typedef
необходимо различать информацию времени компиляции и информацию времени выполнения. C ++ является статически типизированным языком: это означает, что необходимо , чтобы знать все о типе переменной на этапе компиляции. Определение типа не может изменяться в зависимости от условий выполнения: его необходимо разрешить на этапе компиляции.
Кроме того, символы (в основном, все, что имеет идентификатор, является символом) не могут использоваться вне их области видимости. Поэтому, если вы объявите что-либо в блоке if
, вы не сможете получить к нему доступ снаружи этого блока if
.
Поскольку typedef
s делает символы, используя typedef
внутри области действия, делает определенный тип доступным до конца области, и не далее. Например:
if (foo)
{
typedef int myInt;
myInt var = 4; // works
}
myInt baz = 4; // fails