1

コンストラクター Foo(Bar * b) を持つクラス Foo があります。その Bar を指す Foo を返すクラス Bar 内の関数が必要です。私は試します:

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

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 に答える