【发布时间】:2013-04-12 05:42:13
【问题描述】:
我有一个带有构造函数 Foo(Bar * b) 的类 Foo。我想要类 Bar 中的一个函数,它返回一个指向该 Bar 的 Foo。我试试:
Foo& Bar::make_foo() {
Foo f((Bar*)this);
return f;
}
但是 G++ 告诉我:
error: variable ‘Foo f’ has initializer but incomplete type
现在我知道这在堆内存中可以正常工作:
Foo* Bar::make_foo() {
Foo * f = new Foo((Bar*)this);
return f;
}
编辑:显然问题是由于类定义不完整。但是我仍然很好奇是否有适当的习惯用法来返回堆栈内存中的对象。
【问题讨论】:
-
动态分配真的很好用吗?你试过了吗?尽管如此,您的堆栈版本会有问题。
f对象将在make_foo结束时被销毁,返回的引用将悬空。 -
您的
Foo声明是什么样的? -
是的,这就是我所意识到的。是否有在堆栈内存中执行此操作的习惯用法,还是我不应该打扰?
-
@DavidPfau:对于自动持续时间对象(通常被错误地称为“堆栈”对象),规范是返回对象。一旦函数返回,引用或指针将无效。 C++ 通常(但不总是)会忽略临时对象构造和副本,而只是直接修改您分配结果的对象。 C++11 将允许您指定移动构造函数和移动赋值运算符,用于复制由于某种原因可以或不应该工作的情况......但实际上,除非您绝对需要,否则通常不值得。只需返回实际对象。