1

両方がサブクラス化される2つのクラスの依存関係/関係を表現する方法がわかりません。ここで例が役立つと思います:

2つのクラスがあるMasterとしましょうSlaveMasterクラスには、次のようないくつかのメソッドがvoid use(Slave * s)あります。Slave * generateFrom(int a)

class Master
{
  public:
    virtual void use(Slave * s) = 0;
    virtual Slave * generateFrom(int a) = 0;
};

class Slave
{
};

ここで、これらのクラスの両方をサブクラス化したいのですが、それらの間の関係を失いたくありません。

ConcreteMasterA ma();
ConcreteSlaveA * sa = ma.generateFrom(1);
ConcreteMasterB mb();
mb.use(sa); // THIS SHALL NOT WORK


Master * m = new ConcreteMasterA();
Slave * s = m->generateFrom(1); //s should now be a ConcreteSlaveA
m->use(s); // THIS SHALL WORK

この関係をC++クラス/テンプレート/何かで表現する方法はありますか?

追加情報

おそらく私はもっと具体的にする必要があります:

Armロボットアームを表すクラスがあります。ロボットアームの状態は、いくつかのパラメータ(角度、距離)によって指定され、クラスによって表されます。JointVariableVector

後で別のクラスを使用してアームを制御したいのですが、このクラスはとによってエクスポートされたメソッドのみを使用ArmしますJointVariableVector

Arm特定のロボットアーム(スカラやKUKAなど)ごとに正しい機能を提供するためにサブクラス化されます。構造が異なるため、サブクラスが必要ですJointVariableVector(たとえば、1つのサブクラスは2つの角度のみで、別のサブクラスは3つの角度と1つの距離)

4

2 に答える 2

1

私はこのようなことをします

class ConcreteMasterA:public Master
{
    typedef ConcreteSlaveA MySlaveType;
    public:
    virtual void use(Slave * s){
        MySlaveType* ms = dynamic_cast<MySlaveType*>(s);
        assert(ms); // or other type of error handling
    }

    virtual Slave * generateFrom(int a){
        return new MySlaveType();
    }
};

より厳密なテストが必要な場合は、

assert(typeid(s)==typeid(MySlaveType*));

あなたの使用機能で

于 2012-11-28T22:07:37.613 に答える
0

変数Masterは、それを作成したマスターを含むスレーブクラスで使用できます。useが呼び出されたら、この値と比較し、値が等しいときに受け入れます。

class Slave {
private:
    Master * creator;

public:
    Slave(Master* master) : creator(Master) {};
    Master * getMaster() { return creator; }
}

class Master {
    Slave *generateForm(int) {
        return new Slave(this);
    }

    void use(Slave) {
        if (Slave.getMaster) == this) {
             do stuff;
        }
    }
}
于 2012-11-28T21:00:24.663 に答える