2010-11-24 8 views
0

ここは私の問題です。過負荷の問題=機能

私はAguiFontというクラスを持っています。内部的には、フォントローダが設定されているフォントの種類を指すポインタを持っています。私は=演算子をオーバーロードして、ユーザーがメモリを管理する必要がないようにしました。

それは1つの状況を除いて素晴らしい作品です。そのコンストラクタでウィジェットのフォントを設定すると、何らかの理由でそのフォントを使用すると、そのポインタのメモリがすでに解放されているために0xfefefeが返されます。メインの関数の中にフォントをいくつか作成しても問題ありません。そして、私はsomeWidget.setFont()を呼び出しても問題ないですが、setFont()を呼び出します。コンストラクタ内で問題が発生します。ここで

AguiFont& AguiFont::operator=(const AguiFont &tmp) 
{ 
    loader->destroyFont(nativeFontPtr); 

    nativeFontPtr = 0; 
    if(tmp.getFont()) 
     this->nativeFontPtr = loader->loadFont(tmp.getPath().c_str(),tmp.getSize()); 

    this->fontLineHeight = tmp.getLineHeight(); 
    this->fontPath = tmp.getPath(); 
    this->fontSize = tmp.getSize(); 

    return *this; 
} 

がウィジェットのコンストラクタです::(私はそれが実際に成功するはずのテストフォントをロードする必要があり)

AguiWidget::AguiWidget(void) 
{ 
    location = AguiPoint(0,0); 
    size = AguiSize(0,0); 

    parentWidget = 0; 
    dockingStyle = DockingNone; 
    userData = 0; 
    opacity = 1.0f; 
    setFont(AguiFont(std::string("test.ttf"),24)); 
    tintColor = AguiColor(1.0f,1.0f,1.0f,opacity); 
    fontColor = AguiColor(0.0f,0.0f,0.0f,1.0f); 
    isWidgetVisible = true; 
    isWidgetEnabled = true; 
    isWidgetFocusable = false; 
    isWidgetTabable = false; 
    clipChildren = true; 
} 

おかげ

+0

[このよくある質問](http://stackoverflow.com/questions/4172722/)が興味深いかもしれません。 – fredoverflow

+0

@Fred:=>答え。 –

+0

@Konrad:どういう意味ですか?私のコメントを答えに変換しますか?私はそれについてdownvotesを得るだろうと確信しています:) – fredoverflow

答えて

2
ここ

が過負荷に=演算子であります

私はあなたが(表示していない)コピーctorを非難する傾向があります。テンポラリが作成されたときにフォントがコピーされると、最初のデストラクタはおそらくloader->destroyFont(nativeFontPtr);を呼び出します。コピーctorがnativeFontPtrを複製しなかった場合、一時的な有効範囲外になるとすぐに単一の基礎フォントが破棄されます。

+0

私のコピーコンストラクタはこれのためにどのように見えますか、私は一緒に働いている方法がわかりません。 – jmasterx

+0

それはうまくいった! Thanks – jmasterx

+0

"Rule of three":コピーコンストラクタ、デストラクタ、代入演算子が必要な場合は、おそらく3つすべてが必要になるでしょう。しかし、多くの場合、代入演算子は 'AguiFont tmp(source); this-> swap(tmp);これを返す。これは、コピーctorとスワップ機能を再利用します。 – MSalters

0

setFontの署名とは何ですか? AguiFont用のコピーコンストラクタが不足している可能性があります。

+0

はい、コピーコンストラクタはありません。 – jmasterx