C ++: вернуть указатель на дочерний класс - PullRequest
1 голос
/ 23 ноября 2010

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

Со следующим кодом:

A* myInst = (A*) new B;

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

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

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

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

Ответы [ 5 ]

4 голосов
/ 23 ноября 2010

Скорее всего, проблема в том, что компилятор не знает, что такое A или B.Скорее всего, пропущено включение.

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

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

1 голос
/ 23 ноября 2010

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

Кроме того, первое приведение полностью избыточно:

A* myInst = new B;

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

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

0 голосов
/ 23 ноября 2010

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

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

Simples!

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

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

0 голосов
/ 23 ноября 2010

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

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

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

0 голосов
/ 23 ноября 2010

Вы пытались снять конечную точку с запятой после отключения скобки? Например:

A* myInst = (A*) new B;

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...