idioma della memoria statica

1

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.

    
posta DarthRubik 12.05.2016 - 03:24
fonte

1 risposta

1

Se non puoi eseguire l'allocazione dinamica, devi allocare staticamente tutte le possibili istanze ImageImpl che potrebbero essere restituite da FontImpl::GetImage e restituire un puntatore a una di quelle basate sul parametro che viene passato.

Ad esempio:

static ImageImpl image_a;
static ImageImpl image_b;
:
static ImageImpl image_z;

Image* FontImpl::GetImage(char c){
    switch(c)
    {
    case 'a':
        return &image_a;
    case 'b':
        return &image_b;
    case 'z':
        return &image_z;
    }
}
    
risposta data 12.05.2016 - 09:22
fonte

Leggi altre domande sui tag