1

我不知道如何表达两个将被子类化的类的依赖关系/关系。我认为一个例子可以在这里有所帮助:

假设我有两个班级,Master并且Slave. 该类Master有一些方法,例如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

我想稍后使用另一个类来控制手臂,但是这个类只能使用Armand导出的方法JointVariableVector

Arm将被子类化以提供每个特定机器人手臂(例如 SCARA 或 KUKA)的正确功能,并且由于结构不同,我需要子类JointVariableVector(例如,一个子类只有 2 个角度,另一个子类有 3 个角度和一个距离)

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 的从属类中使用变量 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 回答