C ++:如何在堆栈内存中创建一个指向我生成它的对象的对象?

时间:2013-04-18 22:44:19

标签: c++ pointers

我有一个类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;
}

编辑:显然问题是由于课程定义不完整。但是,如果有一个适当的习惯用于在堆栈内存中返回一个对象,我仍然很好奇。

2 个答案:

答案 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;
}