Как нам базовый класс в выходном параметре

Скажем, у меня есть такой код:

class B {}
class D : class B {}

void MakeD(int params, D** out, int* status_out);

Сегодня я называю это так:

B* b;
if (use_d) {
D* d;
MakeD(params, &d, &status)
b = d;
} else...

Есть ли более чистый способ написать это, избегая отдельного объекта ‘d’, но не теряя существующую безопасность типов (т.е. нет reinterpret_cast)?

0

Решение

Есть ли причина, по которой вы не можете просто изменить свой метод MakeD (), чтобы он возвращал новый D вместо передачи указателя на D?

то есть.

D* MakeD(int params, int* status_out);

...

b = MakeD(params, &status);

Или метод MakeD () является частью чужого API?

1

Другие решения

Почему бы не использовать основные функции C ++, такие как конструктор классов и полиморфизм: B* b = new D(params);

0

Что-то вроде

B *b = use_d ? new D(params) : new <something else>;

должно сработать. Я предполагаю что-то другое вероятно B объект (может быть построен с использованием других параметров?) Это должно быть B или класс, полученный из B чтобы код работал.

И, как всегда, не используйте сырье B*вместо

std::unique_ptr<B> ptr( use_d ? new D(params) : new <something else> );
0
По вопросам рекламы [email protected]