我有一个课程Onote
,它是Qt的扩展QGraphicsItem
。
我想创建另一个类Cmelody
,其中包含属于该旋律的Onote
项列表以及所有这些注释共享的一些值,例如iTempo
。
我希望从 phyiscally相同的 Onotes
继承几个Cmelody
,因为它们都需要相互识别,我不能将这两个类都包含在这两个类中?看起来我需要虚拟继承,但有了它,对于每个Onote
,都会有自己的Cmelody
。
是否可以创建一个系统,例如Cmelody c1
将继承Onote o1
和Onote o2
; Cmelody c2
会继承Onote o3
,Onote o4
和Onote o5
吗?当我更改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..
};
答案 0 :(得分: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));
}
答案 1 :(得分:0)
根据你的描述,我认为你说这些音符应该是指包含它们的旋律;这是一个非常不同的继承概念。为此,他们需要包含旋律的引用或指针:
class Onote : public QGraphicsitem
{
public:
Onote(QObject* parent, CMelody* melody) : melody(melody) {}
//various variables and some functions listed..
private:
CMelody* melody;
};
继承意味着一个音符是一个旋律(显然它就像是一个图形项目) - 事实并非如此。