Ecb*_*urt -2 c++ sdl cmake header-files
我正在尝试添加成员函数的定义,game.h但出现编译器错误,指出 void 函数是先前定义的。game.h和 也输出相同的错误game.cpp。这几乎就像pragma once不起作用?我在 Rider 中遇到错误,也在game.cpp文件中说了同样的事情,但仅限于 void 函数。
游戏.h
\n#pragma once\n\n#include "SDL2/SDL.h"\n\n\nclass Game{\npublic:\n\n Game() {}\n ~Game() {}\n\n bool init(const char* title, int xPos, int yPos, int width,int height, int flags);\n\n\n\n void render(){};\n void update(){};\n void handleEvents(){};\n void clean(){};\n\n\n bool running() {return m_bRunning;}\n\nprivate:\n\n SDL_Window* m_pWindow;\n SDL_Renderer* m_pRenderer;\n\n bool m_bRunning{};\n};\nRun Code Online (Sandbox Code Playgroud)\n游戏.cpp
\n#include <iostream>\n#include "game.h"\n\n\nbool Game::init(const char* title, int xPos, int yPos, int width, int height, int flags){\n\n if(SDL_Init(SDL_INIT_EVERYTHING) == 0){\n std::cout << "SDL init success\\n";\n\n m_pWindow = SDL_CreateWindow(title, xPos, yPos, width, height, flags);\n\n if(m_pWindow != nullptr){\n std::cout << "window creation success\\n";\n m_pRenderer = SDL_CreateRenderer(m_pWindow, -1, 0);\n\n if(m_pRenderer != nullptr){\n std::cout << "renderer creation success\\n";\n SDL_SetRenderDrawColor(m_pRenderer,255,255,255,255);\n }\n else{\n std::cout << "renderer failed\\n";\n return false;\n }\n }\n else{\n std::cout << "SDL init fail\\n";\n return false;\n }\n\n std::cout << "Successful initialization\\n";\n m_bRunning = true;\n }\n}\n\nvoid Game::render() {\n SDL_RenderClear(m_pRenderer);\n SDL_RenderPresent(m_pRenderer);\n}\n\n\nvoid Game::handleEvents() {\n SDL_Event event;\n if (SDL_PollEvent(&event)){\n switch (event.type){\n case SDL_QUIT:\n m_bRunning = false;\n break;\n default:\n break;\n }\n }\n}\n\nvoid Game::clean() {\n std::cout << "clenaing up\\n";\n SDL_DestroyWindow(m_pWindow);\n SDL_DestroyRenderer(m_pRenderer);\n SDL_Quit();\n}\nRun Code Online (Sandbox Code Playgroud)\n主程序
\n#include "game.h"\n\nGame* game = 0;\n\nint main(){\n game = new Game();\n game->init("Chapter 1", 100, 100, 640, 480, 0);\n\n while (game->running()){\n game->handleEvents();\n game->update();\n game->render();\n }\n\n game->clean();\n\n return 0;\n\n}\nRun Code Online (Sandbox Code Playgroud)\nCMakeLists.txt
\ncmake_minimum_required(VERSION 3.0.0)\nproject(sdl2_demo VERSION 0.1.0)\n\nadd_executable(sdl2_demo ./src/main.cpp src/game.cpp src/game.h)\n\ntarget_link_libraries(sdl2_demo SDL2)\nRun Code Online (Sandbox Code Playgroud)\n错误
\n====================[ Build | sdl2_demo | Debug ]===============================\n/app/extra/clion/bin/cmake/linux/bin/cmake --build /home/benmarr/repos/sld2_demo/cmake-build-debug --target sdl2_demo -j 12\n[2/3] Building CXX object CMakeFiles/sdl2_demo.dir/src/game.cpp.o\nFAILED: CMakeFiles/sdl2_demo.dir/src/game.cpp.o \n/usr/bin/c++ -g -MD -MT CMakeFiles/sdl2_demo.dir/src/game.cpp.o -MF CMakeFiles/sdl2_demo.dir/src/game.cpp.o.d -o CMakeFiles/sdl2_demo.dir/src/game.cpp.o -c /home/benmarr/repos/sld2_demo/src/game.cpp\n/home/benmarr/repos/sld2_demo/src/game.cpp:39:6: error: redefinition of \xe2\x80\x98void Game::render()\xe2\x80\x99\n 39 | void Game::render() {\n | ^~~~\nIn file included from /home/benmarr/repos/sld2_demo/src/game.cpp:6:\n/home/benmarr/repos/sld2_demo/src/game.h:20:10: note: \xe2\x80\x98void Game::render()\xe2\x80\x99 previously defined here\n 20 | void render(){};\n | ^~~~~~\n/home/benmarr/repos/sld2_demo/src/game.cpp:45:6: error: redefinition of \xe2\x80\x98void Game::handleEvents()\xe2\x80\x99\n 45 | void Game::handleEvents() {\n | ^~~~\nIn file included from /home/benmarr/repos/sld2_demo/src/game.cpp:6:\n/home/benmarr/repos/sld2_demo/src/game.h:22:10: note: \xe2\x80\x98void Game::handleEvents()\xe2\x80\x99 previously defined here\n 22 | void handleEvents(){};\n | ^~~~~~~~~~~~\n/home/benmarr/repos/sld2_demo/src/game.cpp:58:6: error: redefinition of \xe2\x80\x98void Game::clean()\xe2\x80\x99\n 58 | void Game::clean() {\n | ^~~~\nIn file included from /home/benmarr/repos/sld2_demo/src/game.cpp:6:\n/home/benmarr/repos/sld2_demo/src/game.h:23:10: note: \xe2\x80\x98void Game::clean()\xe2\x80\x99 previously defined here\n 23 | void clean(){};\n | ^~~~~\n/home/benmarr/repos/sld2_demo/src/game.cpp: In member function \xe2\x80\x98bool Game::init(const char*, int, int, int, int, int)\xe2\x80\x99:\n/home/benmarr/repos/sld2_demo/src/game.cpp:37:1: warning: control reaches end of non-void function [-Wreturn-type]\n 37 | }\n | ^\nninja: build stopped: subcommand failed.\nRun Code Online (Sandbox Code Playgroud)\n
您的标头中有一些函数的实现(空):
void handleEvents(){};
Run Code Online (Sandbox Code Playgroud)
然后在你的源代码中实现。
void Game::handleEvents() {
SDL_Event event;
if (SDL_PollEvent(&event)){
switch (event.type){
case SDL_QUIT:
m_bRunning = false;
break;
default:
break;
}
}
}
Run Code Online (Sandbox Code Playgroud)
将标头更新为声明:
void handleEvents();
Run Code Online (Sandbox Code Playgroud)