2017-06-20 91 views
0

我有一個像PrintableObject*型的QList:C++ QT鑄造到子類中的項目的QList

QList<PrintableObject*> drawables; 

這個列表包含PrintableX這是插入喜歡的PrintableObject子類類型的對象:

drawables += &PrintableLine(x, y, x2, y2); 

在此之後,我使用列表一個循環,我確定實際類型,做一個演員,並嘗試使用它:

foreach(PrintableObject* drawable, drawables){ 

     if(drawable->myClassName == "PrintableLine") { 

      PrintableLine* line = (PrintableLine*) drawable; 
      painter.drawLine(line->x, line->y, line->x2, line->y2); 

     } else if (drawable->myClassName == "PrintableString") { 

      PrintableString* string = (PrintableString*) drawable; 
      font.setPointSize(string->fontSize); 
      painter.setFont(font); 

      painter.drawText(string->x, string->y, string->width, string->height, Qt::AlignHCenter | Qt::AlignTop, string->string "if I say?"); 

     } 

    } 

除了,當我嘗試使用我的新閃亮降級對象時,它會產生分段錯誤...

有什麼建議嗎?

回答

3

看來你插入一個指向死臨時對象到列表:

drawables += &PrintableLine(x, y, x2, y2); 

嘗試:

drawables += new PrintableLine(x, y, x2, y2); 

您可能還需要考慮增加一個虛擬方法放入您的PrintableObject類中以避免需要RTTI和向下轉換。

+0

謝謝你,你救了我的命!我不是一個C++程序員,但無論如何都要做。至於RTTI,我知道這是一件壞事,但有時我們都必須編寫一些臭的代碼:) – Zhigalin

+1

@Zhigalin快樂地拯救自己的生命:-)注意:一定要刪除您分配的對象。 –