2017-06-20 1 views
0

Ich habe einen QList vom Typ PrintableObject* wie:C++ QT Casting zu Kind-Klassen für Elemente in einem QList

QList<PrintableObject*> drawables; 

Diese Liste enthält Objekte vom Typ PrintableX die Subklassen von PrintableObject sind eingefügt wie:

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

Danach verwende ich die Liste eine Schleife, wo ich den tatsächlichen Typ bestimmen, einen Cast machen und versuchen, es zu verwenden:

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?"); 

     } 

    } 

Ausgenommen, wenn ich versuche, mein neues glänzendes heruntergekommenes Objekt zu benutzen, mache ich einen Segmentierungsfehler ...

Irgendwelche Vorschläge?

Antwort

3

Es scheint, dass Sie einen Zeiger auf einem toten temporäre Objekt in die Liste einzufügen:

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

Versuchen:

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

Sie können auch ein virtuelles ziehen berücksichtigen wollen das Hinzufügen Methode in Ihre PrintableObject Klasse, um die Notwendigkeit der RTTI und Downcast zu vermeiden.

+0

Dank Kerl, du hast mein Leben gerettet! Ich bin kein C++ Programmierer, muss es aber trotzdem machen. Wie für RTTI weiß ich, dass das eine schlechte Sache ist, aber manchmal müssen wir alle etwas stinkenden Code schreiben :) – Zhigalin

+1

@Zhigalin Glücklich, sein Leben zu retten :-) Anmerkung: sicher sein, das Objekt zu löschen, das Sie zuweisen. –