2016-05-12 22 views
-2

私は(私は、静的なメモリ割り当てを持つことができることを意味)マイクロコントローラ上と私は相続で動作するようにしようとしています.....静的ポリモーフィズム問題

は、私は抽象クラスImageと抽象を持っていると仮定クラスFontFontのインスタンスは、そのような関数で与えられたcharのオフに基づいてImageを返すことができます。

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

今、本当の問題は、私が何GetImage機能のために行うには見当がつかないです。

問題はこれです:あなたは、抽象クラスのメンバーを持っているためには、ポインタとして使用する必要があります。だから私のジレンマは、私がFontを持っていて、新しいImageを作り、それを返そうとしているということです。

それは、その新たに作成されたImageあなたは一時的なオブジェクトへの参照を返すさへのポインタを返す場合:

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

をそして私が戻る場合、私はこのような実際の型を返すようにしてみてください。

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

このような静的メモリの問題には、イディオムなどがありますか?

+1

は実際に_static inheritance_何ですか? [CRTP](https://en.wikipedia.org/wiki/Curiously_recurring_template_pattern)で提供されている_staticポリモーフィズム_を意味しましたか? –

+0

@πάνταῥεῖはい私は静的多型を意味しました....私はそれに応じて投稿を編集します – DarthRubik

+0

抽象的な基底クラスの使用は静的多型ではなく、実行時多型です。静的なメモリ割り当てをしています。それが扱いにくい場合は、小さなメモリプールクラスの作成やダウンロードを検討し、静的なバッファから動的な割り当てを行ってください。 –

答えて

1

動的割り当てを使用すると、最も簡単なことだろうが、それができないならば、あなたは関数の外のどこかのインスタンスを格納する必要があり、例えば:

static ImageImpl image; 

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

'Image *'と '&image'を返す必要があり、返されたイメージの使用方法に言及する価値は、GetImageが再び呼び出される前に完了していなければなりません。 –