2014-04-08 146 views
0

我現在很困惑。自從我觸及C++之後已經有一段時間了,我想再次回到它,所以我試圖使用SFML,並且我正在使用一個指南。得到我的東西是這個代碼。C++ SFML成員初始化程序

Game::Game():mWindow(sf::VideoMode(640, 480), "SFML Application") { 
} 

它的功能完美,我想我明白了。它正在初始化mWindow,當mWindow被構造時,它會創建窗口。沒問題。但是當我把這個代碼放下。

Game::Game() { 
    mWindow(sf::VideoMode(640, 480), "SFML Application"); 
} 

它給我的錯誤Type 'sf::RenderWindow' does not provide a call operator,我不知道這意味着什麼,我也不明白這些代碼兩個街區之間的區別。

+2

僅供參考:如果由於某種原因您不能使用初始化程序列表,您可以使用'mWindow.create(...)'。 – Hiura

回答

2

mWindow應該是一個類數據成員,而不是一個函數。

First block of code simply initializes it.

+0

我不認爲它是一個函數,它只是sf :: RenderWindow的一個構造函數。我的主要問題是爲什麼在構造函數體外初始化它,但它不會在裏面工作?我無法在該網頁中找到任何內容來說明原因,或者我很密集 – user2589054

+2

這裏的所有答案都是正確的。 mWindow不是一個函數,你是對的,但是你正在使用它,就像它是一個函數。 @Petr展示瞭如何在不在init-list中時使用它。 – nullpotent

+0

好吧,如果這是一個函數,那麼什麼是sf :: RenderWindow mWindow(sf :: VideoMode(640,480),「SFML Application」); 因爲這很明顯,雖然窗口不會顯示。 – user2589054

0

這就是所謂的Constructor Initialization Lists,它實際上應該是像這樣在你的第二個例子:因爲在你的第二個例子

Game::Game() { 
    this.mWindow = new sf::RenderWindow(sf::VideoMode(640, 480), "SFML Application"); 
} 
+0

該代碼不起作用,只是說= =運算符沒有可行的過載。另外,如果我把它放在主窗口中,sf :: RenderWindow mWindow(sf :: VideoMode(640,480),「SFML Application」); ,它工作得很好。 – user2589054

+1

你的'Game'類中'mWindow'的類型是什麼? – nullpotent

+1

這是因爲'sf :: RenderWindow'繼承自'sf:NonCopyable'。 – Aesthete

1

它給你的錯誤是,這樣的:

mWindow(sf::VideoMode(640, 480), "SFML Application"); 

應該是這樣的:

mWindow = sf::VideoMode(640, 480), "SFML Application"; 

無論如何它不會繼續工作,因爲sf:RenderWindow繼承自sf::NonCopyable

該錯誤實際上是相當具有描述性的,'sf :: RenderWindow'不提供呼叫運營商mWindowsf::RenderWindow的類型。你試圖呼叫它像一個功能,mWindow(),它不是。

您應該在第一個示例中使用初始化程序列表。這將確保mWindow成員構建一次