0

QtからOnote拡張されたクラスがあります。QGraphicsItem

そのメロディーに属するアイテムCmelodyのリストと、それらすべての音符が共有するいくつかの値を保持する別のクラスを作成したいと考えています。OnoteiTempo

どちらもお互いを識別する必要があり、両方のクラスを両方のクラスに含めることはできないため、いくつかを物理的に同じOnotesように継承したいですか? 仮想継承が必要なように見えましたが、それを使用すると、すべてに独自の. CmelodyOnoteCmelody

たとえば、 と を継承するシステムを作成することは可能ですCmelody c1か。とを継承し、? すべての子の値を変更すると、親から読み取るときに同じ値が取得されます。Onote o1Onote o2Cmelody c2Onote o3Onote o4Onote o5CmelodyOnoteCmelody

例証するために、クラス構造は大まかに次のようになります。

class Cmelody
{
public:
    Cmelody(void);
    ~Cmelody(void);
std::vector<Onote*> notes;
//a handful of variables and a function..
};

class Onote : public QGraphicsitem
{
public:
    Onote(QObject* parent);
    ~Onote(void);
//various variables and some functions listed..
};
4

2 に答える 2

1

私があなたの質問を理解したなら、必要なのはこれだけです

class Onote;   // <== Forward declaration of Onote
class Cmelody
{
public:
    Cmelody(void);
    ~Cmelody(void);
std::vector<Onote*> notes;
//a handful of variables and a function..
};

class Onote : public QGraphicsitem
{
public:
    Onote(Cmelody* parent) : parent_(parent) {} // <=== Save a pointer to Cmelody
    ~Onote(void);
//various variables and some functions listed..
private:
   Cmelody* parent_;
};


int main ()
{
   Cmelody melody;
   melody.notes.push_back (new Onote (&melody));
   melody.notes.push_back (new Onote (&melody));
   melody.notes.push_back (new Onote (&melody));
   melody.notes.push_back (new Onote (&melody));
}
于 2012-11-28T16:19:28.270 に答える
0

あなたの説明から、音符はそれらを含むメロディーを参照する必要があると言っていると思います。これは、継承とは非常に異なる概念です。そのためには、メロディーへの参照またはポインターを含める必要があります。

class Onote : public QGraphicsitem
{
public:
    Onote(QObject* parent, CMelody* melody) : melody(melody) {}

//various variables and some functions listed..

private:
    CMelody* melody;
};

継承とは、音符メロディーであることを意味します (明らかにグラフィックスアイテムのよう) - これは事実ではありません。

于 2012-11-28T16:22:33.563 に答える