【发布时间】:2018-01-29 19:21:27
【问题描述】:
在Game.h,我有一个名为Game的类:
class Game
{
public:
Game();
void run();
private:
sf::Event e;
sf::RenderWindow app;
sf::Clock delay;
unsigned counter = 0;
Ice *ball = new Ice(app);
Players *players = new Players(app);
Collision collision;
void handleEvent();
};
然后,在Game.cpp,我使用:
Game::Game() : app({1000,800},"NAME")
{
}
语法
Game::Game() : app(sf::VideoMode(1000,800),"NAME")
{
}
也可以。
我的问题是:为什么我可以在第一种情况下省略sf::VideoMode,如果我这样做,为什么我必须使用{} 作为视频模式参数?在第一种情况下使用() 会导致错误。
【问题讨论】:
-
你能发布你的游戏类变量吗?
-
()根本不应该用于初始化。见list initialization。 -
警告:
Ice *ball = new Ice(app);和Players *players = new Players(app);Game不再遵守三法则。这可能会导致一些令人讨厌的错误和丑陋的调试。我建议您熟悉the Rules of 3, 5, and 0,而不是在这里使用动态分配。您可以在成员初始化器列表中将ball和players初始化为普通的旧成员变量,就像使用app一样。 -
@user4581301 你能举个例子解释一下为什么不遵守这个规则会导致错误吗?
-
有很多方法可以意外复制或分配一个类,常见的情况是把它塞进一个标准容器as in this linked answer,然后按值传递。默认行为导致两个对象指向同一个存储。迟早其中一个副本被销毁并释放指针,这使得另一个副本指向无效内存。
标签: c++ syntax constructor sfml