2010-11-23 3 views
1

Предполагая, что у меня есть абстрактный базовый класс A и выведите B из него.C++: Вернуть указатель на дочерний класс

С помощью следующего кода:

A* myInst = (A*) new B; 

A* GetA() { return myInst; } 
B* GetB() { return (B*) myInst; } 

Первая функция компилируется, второй нет. Ошибка: error C2143: syntax error : missing ';' before '*'

  • Почему я не могу вернуть указатель на дочерний класс A?

Ошибка также возникает, если я заменяю содержимое функции return NULL;!

+0

Дополнительная точка с запятой после объявления функции кажется странной. Попробуйте удалить его. – Lagerbaer 2010-11-23 15:39:06

+0

Не обращайте внимания на то, что функция была inline изначально – Parror 2010-11-23 15:39:53

+0

Какая строка на самом деле ссылается на эту ошибку? Возможно, вы захотите показать нам весь код, потому что `;` ошибки могут означать больше, чем просто отсутствующая точка с запятой (неопределенная, да) – birryree 2010-11-23 15:41:50

ответ

0

Вы пытались взять заднюю полуточку после фиксации? Например:

A* myInst = (A*) new B; 

A* GetA() { return myInst; } 
B* GetB() { return (B*) myInst; } 

Примечания: Я не пробовал это, как я не имею доступ к C++ компилятор в данный момент ...

4

Проблемы, скорее всего, что компилятор не имеет ни малейшего представления, что A или B есть. Скорее всего, отсутствуют.

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

Используйте static_cast (если вы уверены, что конверсия в порядке) или dynamic_cast (если вам нужно проверить).

0

Я собираюсь предположить, что эти строки отображаются в отдельных файлах в вашем фактическом коде, потому что, если они появились, как показано, я не вижу ничего плохого.

Скорее всего, что происходит, когда определено GetB, вы забыли включить для B, и компилятор не может понять, что это тип.

Кроме того, если вы использовали static_cast вместо приведения в стиле C, компилятор предупредит вас, если он не сможет определить связь между A и B.

1

Остерегайтесь отливок C-стиля на C++. Как правило: never использовать их. Используйте соответствующие C++-роли.

Кроме того, первый бросок совершенно излишний:

A* myInst = new B; 

A* GetA() { return myInst; } 
B* GetB() { return static_cast<B*>(myInst); } 

Это прекрасно работает.

0

Большую часть времени вы не должны бросать вообще.

B bInst 
A * myInst = &bInst; 
A* getA() { return &bInst; } 
B* getB() { return &bInst; } 

просто!

Есть редкие случаи, когда вам нужно сбросить иерархию. Обычно это то, где вы загружаете какое-то дополнение и нужно проверить, что объект относится к типу, который вы ожидаете. В этом случае вы используете dynamic_cast <> для проверки, но должны иметь RTTI.

Другой случай возникает, когда у вас есть хранилище несвязанных типов, например вариантов/«любых» типов, которые связаны только тем фактом, что они хранятся вместе в одной коллекции и, вероятно, обрабатываются по-разному после их получения. Это также может произойти в конечной машине. Хотя может быть возможно сконструировать ваш поток здесь, чтобы избежать прикладов, иногда литье легче. В таком случае, хотя вы точно знаете, какой тип у вас есть, и можете static_cast вниз по иерархии к нему.

Смежные вопросы