xzripper
@xzripper
0xC0000005

Как вернуть до пяти типов из одной функции?

Есть функция drawObject, она должна вернуть один из пяти типов - пример такого типа: sf::RectangleShape, или например sf::CircleShape, у всех этих типов есть общий наследуемый класс: sf::Drawable, я пытался сделать возвращаемый тип функции sf::Drawable, но тогда возникала ошибка что невозможно вернуть абстрактный класс из функции. Пытался написать свой общий класс, но ошибка та же, нельзя вернуть абстрактный класс. Также пытался использовать std::variant e.g:
std::variant<sf::RectangleShape, sf::CircleShape, other classes...>
Но такой код крашил программу, других вариантов как сделать я не знаю. Примерная работа функции:
// какой тип?
??? function(int x) {
    if(x == 1) {
        return 1.0f; // float
    } else if(x == 2) {
        return 1; // int
    } else if(x == 3) {
        return 'a'; // char
    }
}

Что делать?
  • Вопрос задан
  • 283 просмотра
Пригласить эксперта
Ответы на вопрос 2
wataru
@wataru Куратор тега C++
Разработчик на С++, экс-олимпиадник.
Надо возвращать указатель на базлвый класс. Ну и, один из 5 экземпляров надо создавать через new.
Ответ написан
@Xiran
Или так:

void drawObject(sf::Drawable &out) {
	out = /* Возвращаемое значение */;
}

void test() {
	sf::CircleShape circleShape { /* ... */ };
	
	drawObject(circleShape); // circleShape = drawObject();
	
	// ...
}


Однако ссылку/указатель на локальный (объявленный в функции) объект возвращать нельзя,
ибо стек функции (там хранятся такие объекты) будет очищен после вызова функции в соответствии
с конвенцией, которую использует функция (обычно __cdecl, в вызовах нестатических функций-членов - __thiscall).
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы