Sono su un microcontroller (il che significa che posso avere solo un'allocazione di memoria statica) e sto provando a lavorare con l'ereditarietà .....
Supponiamo di avere una classe astratta Image
e una classe astratta Font
. Un'istanza di Font
può restituire un Image
basato su char
dato in una funzione come questa:
Font* mf;
Image* image = mf->GetImage("a");
Ora il vero problema è che non ho idea di cosa fare per la funzione GetImage
.
Il problema è questo: in c ++ per avere un membro di una classe astratta devi usarlo come puntatore. Quindi il mio dilemma è che ho un Font
che vuole creare un nuovo Image
e poi restituirlo.
Se restituisce un puntatore al suo Image
appena creato, si restituisce un riferimento a un oggetto temporaneo:
Image* FontImpl::GetImage(char c){
return &ImageImpl(c); //This object is destroyed once this function exits
}
E poi se torno cerco di restituire un tipo reale come questo:
Image FontImpl::GetImage(char c){
return ImageImpl(c); //Cannot cast from ImageImpl to Image
}
Quindi c'è un idioma o qualcosa del genere per questo tipo di problema di memoria statica?
Modifica Questo è quello che sto facendo come correzione temporanea (possibilmente permanente) ... fammi sapere cosa ne pensi:
Ho una nuova classe chiamata UnionBase
che è basata su modelli. L'idea alla base dell'uso di questa classe è che può essere uno qualsiasi dei tipi derivati che inserisci nel modello .... Lo utilizzerai in questo modo:
UnionBase<Image,ImageImpl1,ImageImpl2> myImage;
myImage = ImageImpl1(); //I can assign to it any type in the templates
myImage->ImageMethod(); //I can use all of the methods of the base class
Usando questo idioma, farei questo:
void FontImpl::GetImage(char c, UnionBase& b){
b = //Set it to somthing
}
Il tipo UnionBase
alloca la dimensione del suo membro più grande in modo che tutti possano adattarsi ... se vuoi che io inserisca il codice, posso farlo.