返回对象的C ++函数

时间:2015-06-07 15:10:26

标签: c++ function class

如何编写

的函数

每次都返回一个不同类的对象

取决于其参数?

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;}};

2 个答案:

答案 0 :(得分: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 :(得分:1)

如果你的类都继承自同一个基类,那么@Chris Drew的答案是有效的。但是,如果他们不这样做,则有另一种选择。您可以使用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仍然是实验性的,因此编译器可能无法实现。