[英]Error: "this declaration has no storage class or type specifier" in c++
我正在尝试编写一些代码,使我更容易制作 SDL 程序,因为我正在学习并经常开始新项目。 它基本上需要完成所有标准的 SDL 工作。 这是代码
namespace engine {
class Engine
{
private:
SDL_Renderer* renderer;
SDL_Window* window;
SDL_Event event;
bool initialised = true;
bool quit = false;
public:
Engine(const char* name, int x, int y, int w = SDL_WINDOWPOS_CENTERED, int h = SDL_WINDOWPOS_CENTERED, bool fullscreen = false)
{
window = SDL_CreateWindow(name, x, y, w, h, fullscreen);
if (window == nullptr)
initialised = false;
renderer = SDL_CreateRenderer(window, -1, 0);
if (renderer == nullptr)
initialised = false;
}
~Engine()
{
SDL_DestroyWindow(window);
SDL_DestroyRenderer(renderer);
}
void handleEvents()
{
while (SDL_PollEvent(&event))
{
if (event.type == SDL_QUIT)
{
quit = true;
}
}
}
virtual void update()
{
}
virtual void render()
{
}
void start()
{
if (initialised && !quit)
{
handleEvents();
update();
render();
}
}
};
}
然后从这个继承来制作一个游戏类
class Game : public engine::Engine
{
private:
engine::Engine game{"engine", 1200, 600};
public:
game.update() override
{
}
game.render() override
{
}
};
主要是这样的
int main(int argc, char* argv[])
{
Game game();
game.start();
return 0;
}
但是我收到了标题中指定的错误engine::Engine game{"engine", 1200, 600};
在Game
课上。 我不知道我正在做的事情是否可行或如何去做。 谢谢你的帮助
我的目标:我想要一些代码,就像一个可以在不同 SDL 项目中重用的库。 这个引擎将是一个单独的库。 所以我想要某种从我的项目中的引擎继承的引擎类。 说继承表单引擎的类是game
。 我希望游戏覆盖更新和渲染,以便我可以从渲染函数调用引擎中定义的不同绘图方法。 这样我每次启动项目时都不必为事件制作窗口、渲染器和句柄。 我不知道这是否是一个好方法,但欢迎任何更好的解决方案。
我正在删除Engine
以使示例更小。 我们不需要类中的任何 SDL 内容来展示如何解决这个问题。 除此之外, Engine
看起来还不错。 不需要改变任何东西。
namespace engine {
class Engine
{
private:
bool initialised = true;
bool quit = false;
public:
Engine(const char* , int , int ) // simplified to remove the SDL stuff
{
}
~Engine() // may want this to be virtual. See link about virtual destructors
{
}
void handleEvents()
{
}
virtual void update()
{
}
virtual void render()
{
}
void start()
{
if (initialised && !quit)
{
handleEvents();
update();
render();
}
}
};
}
事情开始出错的地方是尝试实现Engine
。 我将在进行更改时内联评论。
class Game : public engine::Engine // correct
{
// engine::Engine game{"engine", 1200, 600};
// don't need an engine::Engine as a member. Game IS an Engine.
public:
Game ():
engine::Engine {"engine", 1200, 600} // initialize base class here
{
}
// game.update() override
void update() override // use a normal function definition
// Compiler will figure out the rest
{
}
// game.render() override
void render() override // same as above
{
}
};
main
有一个小错误。 该语言有一个小怪癖,其中TYPE name()
看起来像一个函数,而不是一个变量。 这在 C++11 中得到了清理,添加了{}
以进行更一般的初始化1 。
int main()
{
// Game game(); declares a function, game, that returns a Game.
Game game; // defines a variable named game that is a Game. Could also be Game game{};
// note the different braces.
game.start();
return 0;
}
1将它与容器类一起使用时要小心。 vector<int> test{5};
是一个vector
,其中一个元素包含五个,而不是包含从vector<int> test(5);
获得的默认零的五个元素vector<int> test(5);
.
一些补充阅读:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.