我有一個可以使視窗全屏的設定選單。大多數選單元素都取決于視窗大小。默認情況下,所有選單元素都位于調整視窗大小之前的相同位置(這意味著它們不在我想要的位置)。我知道位置需要重新計算,但在這種情況下,我沒有創建一個重置選單中所有元素位置的函式,而是呼叫了初始load()函式。
這是一個幫助的代碼摘要:
while(!exit) {
switch(State) {
case Menu:
Menu settings = Menu(...);
settings.load() //load here
while(State == Menu) {
if (window.fullscreen()) {
settings.load(); //reload here
}
}//end while
break;
default:
break;
}//end switch
}//end while
這行得通,但我擔心load()它第一次被呼叫時使用的記憶體。變數使用相同的名稱,但是否創建了新物件?它們被覆寫了嗎?當我第一次加載選單時,存盤物件的記憶體發生了什么變化?
此外,這里正在加載和重新加載的“什么”是std::unique_ptr<Table>一個std::vector<std::pair<std::string, std::unique_ptr<TextRect>>>.
編輯:Settings類:
class Settings {
Window& _window;
sf::RenderWindow& _win;
//MainState& _mainState;
MenuState& _menuState;
Resources& _res;
Input& _input;
std::unique_ptr<TextRect> SettingsBanner;
std::unique_ptr<Table> SettingsMenu;
std::unique_ptr<Table> SettingsSave;
public:
Settings(Window& pWindow
,MainState& pMainState
,MenuState& pMenuState
,Resources& pResources
,Input& pInput
);
~Settings();
void load();
void update();
private:
void inputs();
};
和load():
void Settings::load() {
//all kinds of variables
SettingsBanner = std::make_unique<TextRect>(_win
,string
,font
,texture
,sf::Color::White
,size
,origin
,position
,sf::Color::White
,outColor
,charSize
,outline
);
//more variables
SettingsMenu = std::make_unique<Table>(_win
,font
,texture
,textureColor
,fillColor
,outColor
,charSize
,outline
);
SettingsMenu->element("FullScreen");
SettingsMenu->element("VSync");
SettingsMenu->element("FrameRate");
SettingsMenu->element("Volume");
SettingsMenu->makeTable("CenterLeft", position, rowCol);
//more variables
SettingsSave = std::make_unique<Table>(_win
,font
,texture
,textureColor
,fillColor
,outColor
,charSize
,outline
);
SettingsSave->element("Save");
SettingsSave->element("Back");
SettingsSave->makeTable("BottomRight", position, rowCol);
}// end func
uj5u.com熱心網友回復:
簡而言之:std::make_unique每次呼叫時都會生成新物件。它不能重用前一個物件的記憶體。如果新物件的建構式拋出例外會發生什么?只有在對現有物件的分配中unique_ptr,舊物件才會被丟棄,如果拋出例外,您將無法到達那里。這確保了例外安全。
你當然可以Settings::load()用不同的方式寫作。如果SettingsBanner不為空,您可以分配 to*SettingsBanner而不是呼叫std::make_unique。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/496792.html
上一篇:是否可以將功能標記為不被優化?
下一篇:C 網路介面無效結果
