编译实现和头文件时出错

Ecb*_*urt -2 c++ sdl cmake header-files

我正在尝试添加成员函数的定义,game.h但出现编译器错误,指出 void 函数是先前定义的。game.h和 也输出相同的错误game.cpp。这几乎就像pragma once不起作用?我在 Rider 中遇到错误,也在game.cpp文件中说了同样的事情,但仅限于 void 函数。

\n

游戏.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};\n
Run 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}\n
Run 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}\n
Run Code Online (Sandbox Code Playgroud)\n

CMakeLists.txt

\n
cmake_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)\n
Run 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.\n
Run Code Online (Sandbox Code Playgroud)\n

lcs*_*lcs 7

您的标头中有一些函数的实现(空):

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)