繁体   English   中英

C ++ - 返回对象的函数

[英]C++ - function that returns object

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

molly->eatFood()molly->eatFood() “免费使用”错误吗?

更正了您的程序并创建了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;
}

它会产生输出:

Cat Cat2 created.
Food eaten by cat named Cat2.
Cat Cat1 created.
Food eaten by cat named Cat1.
Cat Cat1 destroyed.
Cat Cat2 destroyed.

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

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

除了程序结束时的内存泄漏之外,内存的无效使用没有错误。 如果在堆上创建了某些东西(例如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;
}

由于lady是在堆上创建的(使用new ),因此退出makeCat方法时不会销毁它。 因此,对molly的呼吁是完全有效的。

但是,你有内存泄漏。 你需要在使用它之后删除molly (将来某个时候)。由于你的程序结束,这不是什么大问题。 在一个更大的计划中,这将是一个非常大的交易。

问题不在于“免费使用”; 更可能是你没有删除新实例。

如果你的编译器支持c ++ 11,你可以在这里使用unique_ptr:

#include <iostream>
#include <memory>

using namespace std;
class Cat {
    public:
        Cat() {
            cout << "Cat created" << endl;
        }
        ~Cat() {
            cout << "Cat destroyed" << endl;
        }
        void eatFood() {
            cout << "Cat is eating food" << endl;
        }
};

unique_ptr<Cat> makeCat() {
    unique_ptr<Cat> lady( new Cat );
    return lady;
}

int main () {
    unique_ptr<Cat> molly = makeCat();
    molly->eatFood();
    return 0;
}

现在,您不必担心删除创建的对象。 一旦molly指针超出范围,它将被删除:

Cat created
Cat is eating food
Cat destroyed

我认为它应该是Cat *ladyCat *molly ,但是它应该没问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM