2011-08-01 89 views
0

程序工作正常,但內存驗證程序報告錯誤未初始化讀線CProfiles配置文件;類初始化問題

CProfiles外部的CProfiles類的「配置文件」定義是不好的編程習慣嗎?

這裏是我的代碼: 內profiles.cpp

#include "profiles.h" 

CProfiles profile; // Here it reports the problem 
KeyProfile* keyProfile=&profile; // keyProfile is later used in other classes 
//------------------------------------------------------------- 

CProfiles::CProfiles():forceDialog(0) 
{ 
     oldName=""; 
} 

int CProfiles::Init() 
{ 
    _chdir(PROFILES_PATH); 
} 

CProfiles::~CProfiles() 
{ 
} 

內profiles.h

#define PROFILES_PATH   "Profiles" 
#include "KeyProfile.h" 

class CProfiles: public KeyProfile 
{ 

    public: 
     CProfiles(); 
     ~CProfiles(); 
     int Init(); 
     bool forceDialog; 
     string oldName; 
}; 

extern CProfiles profile; 

KeyProfile.h

public: 
    virtual UINT GetKeyUp()  { return DIK_UP; } 
    virtual UINT GetKeyDown() { return DIK_DOWN; } 
    virtual UINT GetKeyLeft() { return DIK_LEFT; } 
    virtual UINT GetKeyRight() { return DIK_RIGHT; } 
    virtual UINT GetKeyAction() { return DIK_RETURN; } 
    virtual UINT GetKeyCancel() { return DIK_RCONTROL; } 
     virtual UINT GetKeyEsc() { return DIK_ESCAPE; } 
    KeyProfile(void){}; 
    virtual ~KeyProfile(void){}; 
    }; 
    extern KeyProfile* keyProfile; 
+1

向我們展示'KeyProfile :: KeyProfile()'(以及繼承鏈中的其他相關構造函數)。 – NPE

+0

class KeyProfile { public: \t virtual UINT GetKeyUp()\t \t {return DIK_UP; } \t virtual UINT GetKeyDown()\t {return DIK_DOWN; } \t virtual UINT GetKeyLeft()\t {return DIK_LEFT; } \t virtual UINT GetKeyRight()\t {return DIK_RIGHT; } \t virtual UINT GetKeyAction()\t {return DIK_RETURN; } \t virtual UINT GetKeyCancel()\t {return DIK_RCONTROL; } virtual UINT GetKeyEsc()\t {return DIK_ESCAPE; } \t KeyProfile(void){}; \t virtual〜KeyProfile(void){}; }; – en667

+0

對不起。已更新爲原始帖子。 KeyProfile.cpp爲空。沒有找到其他相關的構造函數。 – en667

回答

0

更新:其實我發現了一個問題。這是靜態初始化順序失敗。有關該問題的更多信息,例如這裏:Constructors - How do I prevent the "static initialization order fiasco"?

這裏是我的代碼裏面的解決方案:

// in profiles.cpp 

//CProfiles profile; // Insted this, I access the instance through the profile() function 
CProfiles& profile()  
{ 
    static CProfiles* ans = new CProfiles(); 
    return *ans; 
} 
KeyProfile* keyProfile=profile(); 

而且我通過配置文件訪問實例()函數,我到處都需要它。

0

您所使用的代碼分析器是抱怨因爲你已經實例化了一個自動對象CProfiles profiles;。關鍵字extern告訴編譯器,您正在設置的對象external將在其他地方創建,因此鏈接器將在稍後找到該符號,並使其全部工作。代碼分析器讓你知道你可能忘記初始化你的對象。

+0

所以我應該讓它保持原樣,還是改變它? – en667

+0

@ en667:取決於你。在從中讀取任何數據之前,您需要對該對象執行一些操作。 – 2011-08-01 17:20:32

+0

謝謝。只是一個普遍的問題:如果我需要儘快採取措施,那麼更適合的做法是什麼? – en667