我有一个类Foo,带有构造函数Foo(Bar * b)。我想要一个类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;
}
编辑:显然问题是由于课程定义不完整。但是,如果有一个适当的习惯用于在堆栈内存中返回一个对象,我仍然很好奇。
答案 0 :(得分:1)
这段代码是错误的,因为它在堆栈上返回一个对象,这意味着一旦你从函数返回,那个空间就可以存储在其他对象中 - 这根本就不会结束。
Foo& Bar::make_foo() {
Foo f((Bar*)this);
return f;
}
只要声明Bar
应该是这样,你就应该能够做到这一点 - 除了“你正在使用将被释放的堆栈空间”之外。
答案 1 :(得分:0)
以下适用于我(http://codepad.org/feWQYjtt)。注意:我略微更改了make-foo
的签名,返回本地对象的引用没有意义。
struct Bar;
struct Foo {
Foo( Bar * ) {}
};
struct Bar {
Foo make_foo() { // Signature changed
return Foo( this );
}
};
int main() {
Bar barObj;
Foo fooObj = barObj.make_foo();
(void) fooObj;
}