0

我有一个从 QtOnote扩展的类。QGraphicsItem

我想创建另一个类,其中包含属于该旋律Cmelody的项目列表以及所有这些音符共享的一些值,例如.OnoteiTempo

我希望Onotes从物理上继承几个相同的 Cmelody,因为它们都需要相互识别,并且我不能将两个类都包含在两个类中?似乎我需要虚拟继承,但有了它,每个Onote都有它自己的Cmelody.

是否有可能创建一个系统,例如,Cmelody c1将继承Onote o1Onote o2; 并且Cmelody c2会继承Onote o3,Onote o4Onote o5? 当我更改 a 中的一个值时,它的Cmelody所有子级在从其父级Onote读取它时都会获得相同的值。Cmelody

为了演示,类结构大致如下所示:

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 回答