5

C++ で、 class のオブジェクトを返すメンバー関数と、 class のオブジェクトを返すメンバー関数を持つように、Aと と呼びましょう。BAfBBgA

(以下のテキストは、「宿題をした」ことを示すためのものです。)

問題は、最初に定義されたクラスの関数の戻り値の型が不完全な場合に、これらの関数の署名を記述する方法です。オブジェクトは値によって返されるため、前方宣言はここでは役に立ちません。

はい、私はすべての回避策を知っています (フレンド グローバル関数、ポインターで返すなど)。ただし、上記のインターフェイスを C++ で実装できるかどうかを知りたいだけです。例として、クラスで operator() を return にオーバーロードし、クラスでAreturnにオーバーロードしようとしているとします。私は演算子をオーバーロードしているので、値で返す必要があります (まあ、動的割り当て地獄が必要でない限り:)、() はメンバー関数としてオーバーロードする必要があるため、グローバル フレンドを使用できません。BBA

4

2 に答える 2

8

class Aはい、宣言した後の関数定義を実装しますclass B

class B;

class A
{
    B f();
};

class B
{
    A g() { A a; return a; }
};

B A::f(){ B b; return b; }
于 2011-05-21T05:52:39.577 に答える
0

依存ループを断ち切る別の方法は、次のようにテンプレート メンバー関数を使用することです。

struct A {
    template<typename T>  T f() { return T(); }
};

struct B {
    A g() { return A(); }
};

int main() {
    A a;
    B b = a.f<B>();
    A a1 = b.g();
    return 0;
}

これは operator() でも機能しますが、呼び出し構文はかなり見苦しくなります:a.operator()<B>()

于 2011-05-21T05:51:03.110 に答える