1

我有一个带有构造函数 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;
}

编辑:显然问题是由于类定义不完整。但是,我仍然很好奇是否有适当的习语可以在堆栈内存中返回对象。

4

2 回答 2

1

无论如何,这段代码都是错误的,因为它在堆栈上返回一个对象,这意味着一旦您从函数返回,该空间可用于存储其他对象 - 这根本不会结束。

Foo& Bar::make_foo() {
  Foo f((Bar*)this);
  return f;
}

只要按照Bar应有的方式声明,您就应该能够做到这一点 - 除了担心“您正在使用将被释放的堆栈空间”。

于 2013-04-18T22:53:31.337 回答
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;
}
于 2013-04-18T22:55:26.280 回答