c++:如何在堆栈内存中创建指向生成它的对象的对象

C++: how do I create an object in stack memory that points to the object I am generating it from?

本文关键字:对象 创建 内存 堆栈 c++      更新时间:2023-10-16

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

编辑:显然问题是由于一个不完整的类定义。然而,我仍然很好奇是否有一个合适的习语来返回堆栈内存中的对象。

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

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

只要声明了Bar,你就应该能够很好地做到这一点——除了担心"你正在使用即将被释放的堆栈空间"。

以下内容适用于我(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;
}