2014-04-08 105 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成员构建一次