C++ - 返回对象的函数

Kev*_*ith 17 c++

// Assume class definition for Cat is here.

Cat makeCat() {
    Cat lady = new Cat("fluffy");
    return lady;
}

int main (...) {
    Cat molly = makeCat();
    molly->eatFood(); 
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

是否会出现"免费使用"错误molly->eatFood()

Not*_*ist 23

更正了您的程序并创建了一个示例实现class Cat:

#include <iostream>
#include <string>

class Cat {
public:
        Cat(const std::string& name_ = "Kitty")
        : name(name_)
        {
                std::cout << "Cat " << name << " created." << std::endl;
        }
        ~Cat(){
                std::cout << "Cat " << name << " destroyed." << std::endl;
        }
        void eatFood(){
                std::cout << "Food eaten by cat named " << name << "." << std::endl;
        }
private:
        std::string name;
};

Cat* makeCat1() {
        return new Cat("Cat1");
}

Cat makeCat2() {
        return Cat("Cat2");
}

int main (){
        Cat kit = makeCat2();
        kit.eatFood();

        Cat *molly = makeCat1();
        molly->eatFood();
        delete molly;

        return 0;
}
Run Code Online (Sandbox Code Playgroud)

它会产生输出:

Cat Cat2 created.
Food eaten by cat named Cat2.
Cat Cat1 created.
Food eaten by cat named Cat1.
Cat Cat1 destroyed.
Cat Cat2 destroyed.
Run Code Online (Sandbox Code Playgroud)

我建议你在继续之前学习一本关于C++封面的基础书.

  • ...虽然它可能产生不同的输出,因为C++标准不需要编译器尽可能地忽略不必要的副本.因此,完全有可能看到另外两个"Cat Cat2被破坏"的消息(例如没有RVO) (5认同)

jwu*_*ler 7

new Cat("fluffy")创建一个指针.您需要指定Cat*为返回类型.由于对象是在堆中创建的,因此在返回函数后它仍然可用.


Bri*_*ndy 5

除了在程序结束时发生内存泄漏外,对于内存的无效使用没有错误。如果在堆上创建了某些东西(例如使用new),则需要调用delete它以释放它。

您也有很多语法错误,下面将进行更正。

Cat* makeCat() 
{
  Cat *lady = new Cat("fluffy");
  return lady;
}

int main (int argc, char** argv) 
{

  Cat* molly = makeCat();
  molly->eatFood(); 

  delete molly;//This was added
  return 0;
}
Run Code Online (Sandbox Code Playgroud)