3

次のクラスがあります。

class A {
    // Whatever
};

class B {
    T attribute;
    A a;
};

ここで、次のシナリオがあるとします。

A aX, aY;  
B bX, bY;  

これで、aXまたはaYに「挿入」することができます。 bXbY

タイプ A のオブジェクトに、それらがどの B に属しているか、つまり、attribute「スーパークラス」B の " " が 何であるかを知ってもらいたいのです。

質問:

タイプ A のオブジェクトを「スーパークラス」B 間で自由に移動できるようにしたいのですが、実行時に B の属性を動的にリークする方法が必要です。そのため、タイプ A のオブジェクトは、自分が属する B を常に認識しています。 to (または、現在の B の属性は何ですか)。

それを行う最良の方法は何ですか?

4

4 に答える 4

2

あなたができることの1つは、その「親」Aへのポインタを与えることです:B

class A {
public:
  A() : b_(0) {}
  explicit A(B* parent) : b_(parent) {}
private:
  B* b_;
};

class B {
  B() : a(this) {}
};
于 2012-04-29T14:42:54.157 に答える
2

おそらくこれは便利です (所有者から属性へのポインター、およびその逆):

class A;

class B {
    T attribute;
    A* a;
public:
   void setA(A* newA);
   T getAttribute() {return attribute;}
   void setAttribute() {/*some code*/}
};

class A {
   B* Owner;
   friend void B::setA(A* newA);
public:
    void setOwner(B* newOwner) {
        newOwner->setA(this);
    }
};

void B::setA(A* newA)
{
    A* tempA = this->a;
    B* tempB = newA->Owner;

    tempA->Owner = NULL;
    tempB->a = NULL;

    this->a = newA;
    newA->Owner = this;
}

更新:サイクル ポインティングとサイクル コールのバグを修正しました。これは、フレンド機能でのみ解決できます。

于 2012-04-29T14:54:12.850 に答える
1

Binへのポインタを設定し、inへAの参照を使用して、オブジェクトから直接必要なものを取得できます。ABA

#include <iostream>

class B;

class A {
    B *_b;
public:
    void setB(B *b) {
        _b = b;
    }

    B *getB() {
        return _b;
    }
};

class B {
    int _attribute;
    A &_a;
public:
    B(A& a, int attribute) : _attribute(attribute), _a(a) {
        _a.setB(this);
    }

    int getAttribute() {
        return _attribute;
    }
};

int main(int argc, const char *argv[])
{
    A a1;
    B b1(a1, 5);

    A a2;
    B b2(a2, 10);

    std::cout << a1.getB()->getAttribute() << std::endl;
    std::cout << a2.getB()->getAttribute() << std::endl;

    return 0;
} 

出力:

5
10
于 2012-04-29T15:00:22.827 に答える
1

「B」クラスをインターフェースとして定義します。「getAttribute」メソッドを作成し、「B」のポインタを「A」クラスのインスタンスに設定します。これで、「B」クラスの子を作成して「A」クラスを追加することができ、「A」クラスは常に「B」の属性を知ることができます。

class A 
{
    // Whatever
    B* pointerToB;
    void setB(B* b){ pointerToB = b; }
};

class B 
{
    virtual void someMethod() = 0;
    void addA(A* a)
    {
       a->setB(this);
       this->a = *a;
    }  
    T getAttribute(){ return attribute; }
    T attribute;
    A a;
};

class BB : public B {} // define BB's someMethod version or more method's
于 2012-04-29T14:46:15.730 に答える