2

私はおそらく非常に単純なものを見逃していますが、誰かが私を正しい方向に向けることができれば非常に感謝しています.

AとBの2つのクラスがあります。Aには、データ構造とそれらを変更する関数のコレクションがあります(架空の例として、データ構造への追加、削除、挿入など)。B には、A でのデータ構造の変更方法を指定する関数のコレクションがあります。

拡張性のために、B は継承されて、A のデータ構造で考えられるさまざまな動作を反映します。B の 1 つの実装では、A のデータ構造の先頭に追加したり、末尾から削除したりすることを選択できます。別の実装では、最後に追加したり、最初から削除したりする場合があります。

A の作成中に基本クラス B のオブジェクトを渡しているので、A の一般的な addNode()、deleteNode()、およびその他の関数は、作成中に渡された特定のタイプの B オブジェクトを実際に検索して参照できます。従うべきアクションに関する B での実装。

以下の架空の例では、対象となるデータ構造は二重連結リストです。私の問題では、データ構造自体は問題ではありません。B の派生クラスで正しいメソッドを呼び出して、A のデータ構造を変更する方法が気になります。

クラスA:

class A
{
    static A create(B bObj);  // returns an A object after calling the constructor
    void addNode(int);
    void deleteNode();
    ...
private:
    struct myNode
    {
        int value;
        myNode *next;
        myNode *prev;
    }
    myNode *head;
    myNode *tail;
}

クラス B:

class B
{
    virtual void addNode(int);
    virtual void deleteNode();
    ...
}

クラス ChildB1:

class ChildB1
{
    void addNode(int)
    {
        // code for add to the front
    }
    void deleteNode()
    {
        // code for delete from the back
    }
}

クラス ChildB2:

class ChildB2
{
    void addNode(int)
    {
        // code for add to the back
    }
    void deleteNode()
    {
        // code for delete from the front
    }
}

私が直面している問題は、B の子クラスに、操作中の AI の現在のオブジェクトへのアクセスを与える方法ですか? create() メソッドで A のオブジェクト (aObj) を作成しているときに、ChildB2 オブジェクトへの参照を渡したとします。

B *bObj = new ChildB2();
A aObj = A.create(*bObj);

ここで、aObj.add() を呼び出すときに、ChildB2 クラスの add() メソッドを呼び出して、A のリンク リストを操作し、リストのバックエンドに追加できるようにします。しかし、ChildB2 クラスの add() 関数はどのようにして aObj の連結リストにアクセスするのでしょうか?

質問が長々と素朴で申し訳ありません。必要に応じて、さらに説明をさせていただきます。

4

1 に答える 1

0

Bの友達として追加しAます。

class A
{
   friend class B;
   // the rest
};

友情は継承されないため、継承者にプライベート パーツへのBアクセスを明示的に提供する必要があります。A

class B
{
  protected:
    // since A::myNode is private, redeclare it here
    // for heirs
    typedef A::myNode myNode;

    // access to A parts
    void getAParts (A*, myNode*** head, myNode*** tail)
    {
      *head = &a->head;
      *tail = &a->tail;
    }
    // the rest

};

いくつかの注意事項:値ではなく参照で渡す必要がありBます。そうしないと、オブジェクトがスライスされます。また、何らかの方法で s の寿命を管理する必要があります。createChildB2B

于 2013-01-27T23:28:11.280 に答える