0

次の質問は重複しているように見えるかもしれませんが、サイト内のどこにも正確なアイデアを見つけることができませんでした.

簡単な紹介: この質問は、クラスでもう少し複雑な継承の組み合わせを理解しようとしていたときに提起されました。

質問を提示する前に 1 つ注意してください - 私は一種の「解決策」を探しているのではなく、トピックについてあなたと議論し、より良い考え方を習得したいだけです.

次の行があるとします。

class C : public B 
{
    public : 
        C (const B& b) : B (b) {}
        B& operator*() {return *this;}
};

int main() {
    A* pA = new B();
    C& c = pA -> doIt();
    *c = *pA;
    c = *pA;
    return 1;
}

このコードは完全ではなく、これが全体の目的です。このコードの制約に準拠して抽出すると仮定します。それでも、コードを書くだけでなく、頭から離れた上にある制約について説明するように依頼するのではなく、具体的な質問を追加します。

次の行にはどのような制約がありますか :

C& c = pA -> doIt();

私が理解している限り、上記のコードには、これらのクラスの階層順序である 1 つの開始制約があります。C は B から派生し、B は A から派生します (間違っている場合は修正してください..)

上記の階層を維持しながら実際にこれらのクラスを定義しようとしましたが、doIt() で派生クラス C の型を返すことができませんでした。 A 関数のプロトタイプで不完全な型 C& を使用できますが、まだタイプ C のオブジェクトを返すことができません。

前もってありがとう、SyndicatorBBB

4

1 に答える 1

2

これを試して:

class C;

struct A
{
    C & doIt();
};

struct B : A
{
  void operator=(A const &) { }
};

class C : public B
{
public :
    using B::operator=;
    C (const B & b) : B(b) {}
    B & operator*() { return *this; }
};

C & A::doIt()
{
    static B bimpl;
    static C cimpl(bimpl);
    return cimpl;
}

暗黙の代入演算子はベース バージョンを非表示にするため、using宣言で演算子を明示的に再表示する必要があることに注意してください。

于 2013-01-25T14:27:27.260 に答える