2015-06-07 2 views
-1

Как я могу написать функцию, котораяC++ многочисленные функции, которые возвращают объекты

возвращает объект другого класса каждый раз

в зависимости от его параметров?

экс

class pet{....}; 
class cat:public pet {.....}; 
class dog:public pet {.....}; 
cat_or_dog make pet (int a){ 
if (a) { cat b; return b;} 
else { dog b; return b;}}; 
+0

Я считаю, что вы ответили на свой вопрос. – Carcigenicate

+0

Вам действительно нужно использовать указатели для использования полиморфизма. Если бы я был вами, я бы сделал шаг назад и просмотрел функции, так как ваше определение ошибочно нечетным образом. – Carcigenicate

ответ

3

Я предполагаю, что вы хотите воспользоваться полиморфизмом.

Ваша функции нужно будет возвращать указатель на pet, предпочтительно смарт-указатель, как std::unique_ptr<pet>:

#include <memory> 

class pet{ 
public: 
    virtual ~pet(){}; 
}; 
class cat:public pet {}; 
class dog:public pet {}; 

std::unique_ptr<pet> makePet(int a){ 
    if (a) 
    return std::unique_ptr<pet>(new cat); 
    else 
    return std::unique_ptr<pet>(new dog); 
} 

int main() { 
    auto pet = makePet(2); 
} 

И ваш pet должен иметь виртуальный деструктор, чтобы очистить должным образом.

+1

Предпочтительно использовать 'std :: make_unique ()', если он доступен .. – Mankarse

1

@ Ответ Криса Дрю работает, если ваши классы наследуются от одного и того же базового класса. Однако, если они этого не делают, есть другой вариант. Вы можете использовать std::optional для необязательного возврата объекта. Вы можете использовать его как этот

std::pair<std::optional<cat>, std::optional<dog>> makePet(int a) 
{ 
    std::pair<std::optional<cat>, std::optional<dog>> pet; 
    if(a) 
     pet.first = cat(); 
    else 
     pet.second = dog(); 
    return pet; 
} 

Вы можете проверить, какое животное там, проверив std::optional в паре, как этого

std::pair<std::optional<cat>, std::optional<dog>> pet = makePet(i); 

if (pet.first) 
{ 
    //Do things with cat 
} 
else 
{ 
    //Do things with dog 
} 

Будьте осторожны, хотя, что std::optional все еще является экспериментальным, поэтому он не может быть реализованный вашим компилятором.

+0

Рассмотрите также [Boost.Variant] (http://www.boost.org/doc/libs/1_58_0/doc/html/variant.html). –

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