![](/img/trans.png)
[英]C++,class, a function that returns an object
[英]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 *lady
和Cat *molly
,但是它应该没问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.