2016-05-12 6 views
-2

Ich bin auf einem Mikrocontroller (was bedeutet, dass ich nur statische Speicherzuweisung haben kann) und ich versuche, mit Vererbung zu arbeiten .....Static Polymorphismus Ausgabe

Angenommen, ich habe eine abstrakte Klasse Image und eine abstrakte Klasse Font. Eine Instanz Font kann ein Image aus den in einer Funktion wie so gegeben char Basis zurückgeben:

Font* mf; 
Image* image = mf->GetImage("a"); 

nun das eigentliche Problem ist, ich habe keine Ahnung, was für die GetImage Funktion zu tun.

Das Problem ist das: in C++ für Sie ein Mitglied einer abstrakten Klasse müssen Sie es als Zeiger verwenden. Also mein Dilemma ist, dass ich eine Font habe, die eine neue Image erstellen und dann zurückgeben will.

Wenn es einen Zeiger auf seine zurück neu erstellten Image Sie einen Verweis auf ein temporäres Objekt Rückkehr:

Image* FontImpl::GetImage(char c){ 
    return &ImageImpl(c); //This object is destroyed once this function exits 
} 

Und dann, wenn ich kehre ich versuchen, einen tatsächlichen Typ wie folgt zurück:

Image FontImpl::GetImage(char c){ 
    return ImageImpl(c); //Cannot cast from ImageImpl to Image 
} 

Also gibt es ein Idiom oder etwas für diese Art von statischem Speicherproblem?

+1

Was eigentlich _static inheritance_ ist? Meintest du _static polymorphism_ wie mit [CRTP] (https://en.wikipedia.org/wiki/Curiously_recurring_template_pattern) zur Verfügung gestellt? –

+0

@ πάνταῥεῖ Ja ich meinte statischen Polymorphismus .... Ich werde den Beitrag entsprechend bearbeiten – DarthRubik

+0

Mit abstrakten Basisklassen ist Laufzeit Polymorphie nicht statische Polymorphie. Sie machen statische Speicherzuweisung. Wenn dies jedoch unhandlich wird, möchten Sie vielleicht das Schreiben oder Herunterladen einer kleinen Speicherpoolklasse untersuchen, also nehmen Sie selbst eine dynamische Zuweisung aus einem statischen Puffer vor. –

Antwort

1

Mit der dynamischen Zuordnung wäre am einfachsten, aber wenn das nicht möglich ist, müssen Sie die Instanz speichern irgendwo außerhalb der Funktion, z.B .:

static ImageImpl image; 

Image& FontImpl::GetImage(char c) { 
    image = ImageImpl(c); 
    return image; 
} 
+0

Sollte 'Image *' und '& image' zurückgeben, sollte die Verwendung des" returned "-Bildes erwähnt werden, bevor" GetImage "erneut aufgerufen wird, da das zuvor zurückgegebene Bild überschrieben wird. –