2013-08-25 165 views
0

我有下面的類靜態成員的Qt對象在C++

class QBoardImages 
{ 
public: 
    QImage empty_white; 
    QImage empty_black; 
    QImage possible_move; 
    QImage lighter; 
    QImage choosed; 
    QImage multiple_move; 

    QImage blue_pawn; 
    QImage blue_queen; 
    QImage blue_skydiver; 
    QImage red_pawn; 
    QImage red_queen; 
    QImage red_skydiver; 

    QBoardImages(); 
}; 

與構造,在那裏我有:

QBoardImages::QBoardImages() 
{ 
    QDir::setCurrent(QApplication::applicationDirPath()); 

    empty_white.load("images/board/white.png"); 
    empty_black.load("images/board/black.png"); 
    lighter.load("images/board/lighter.png"); 
    choosed.load("images/board/choosed.png"); 
    blue_pawn.load("images/board/blue_pawn.png"); 
    blue_skydiver.load("images/board/blue_skydiver.png"); 
    blue_queen.load("images/board/blue_queen"); 
    red_pawn.load("images/board/red_pawn.png"); 
    red_skydiver.load("images/board/red_skydiver.png"); 
    red_queen.load("images/board/red_queen.png"); 
    possible_move.load("images/board/possible_move.png"); 
} 

,當然我想只有一次加載這些圖像,但我無法要做到這一點。什麼是加載這些圖像只有一次的最佳方式?

謝謝大家

+2

*「我想只有一次加載這些圖像,但我無法做到這一點..「*爲什麼?是因爲你在應用程序中創建了多個'QBoardImages'實例?如果是的話......不? – WhozCraig

+0

是的。但我只需要在其他類的多個場合使用QBoardImages。當然,我只能創建一個QBoardImages實例,但爲此我需要靜態變量......當然,我可以使用一些快速和難看的解決方案,但我想找到一些優雅和普遍的東西。例如,我找到類似於Java中的靜態對象的解決方案。 – Firzen

+0

1)使用單例有什麼錯誤? 2)你也可以讓這些QImages *靜態成員(即全局變量,在類範圍內),但這是一個壞主意,原因有很多。這將導致您使用'Q_GLOBAL_STATIC'或指向QImages的指針。 – peppe

回答

2

最乾淨的方法是:

  1. 使你的類,因爲它現在是在應用
  2. 提供一個指針的開始這個類的
  3. 實例化一個對象或者將此對象引用到其他需要這些圖像的類的構造函數中。

這看起來像這樣用引用(使用指針,如果你喜歡):

class MyOtherClass1 : // ... 
{ 
public: 
    MyOtherClass1(QBoardImages & boardImages) : 
     boardImages_(boardImages) 
    { 
     // ... 
    } 

private: 
    QBoardImages & boardImages_; 
}; 

class MyOtherClass2 : // ... 
{ 
    // same pattern 
} 

int main(/* ... */) 
{ 
    // ... 

    QBoardImages boardImages; 
    MyOtherClass1 object1(boardImages); 
    MyOtherClass1 object2(boardImages); 

    // ... 
} 

另一種方法,不乾淨的,但可能是最容易實現的,因爲你不必通過boardImages對象對每個構造函數來說,的確是使用靜態方法/對象。單例模式是實現這一點的典型方式,但在你的情況下,問題在於你打電話QApplication::applicationDirPath(),根據你使用這個類的地方,這可能是不可訪問的。

解決這個問題的方法是自己實例化和刪除內存,並確保在這些調用之間只使用這個類。例如:

// QBoardImages.h 

class QBoardImages 
{ 
public: 
    static QBoardImages * instance(); 
    static void makeInstance(); 
    static void deleteInstance(); 

    QImage empty_white; 
    // ... 

private: 
    QBoardImages(); 
    static QBoardImages * instance_; 
}; 

// QBoardImages.cpp 

QBoardImages * QBoardImages::instance_ = 0; 
void QBoardImages::makeInstance(){ instance_ = new QBoardImages; } 
void QBoardImages::deleteInstance(){ delete instance_; } 

QBoardImages * QBoardImages::instance() 
{ 
    if(!instance_) 
     makeInstance(); 

    return instance_; 
} 

QBoardImages::QBoardImages() 
{ 
    QDir::setCurrent(QApplication::applicationDirPath()); 

    empty_white.load("images/board/white.png"); 
    // ... 
} 

// main.cpp 

int main(int argc, char ** argv) 
{ 
    QApplication app(argc, argv); 
    QBoardImages::makeInstance(); // make sure to call this 
            // after instantiation of app 

    // ... 

    int retValue = app.exec(); 
    QBoardImages::deleteInstance(); 
    return retValue; 
} 

現在,你可以在任何地方使用您的圖像調用makeInstancedeleteInstance之間使用:

QBoardImages::instance()->empty_white 
+0

非常感謝!這很難過,這是最乾淨的解決方案..但它運作良好。 – Firzen