C++ SDL项目成员函数重定义编译错误求助
问题解决指南
1. 成员函数重定义错误
错误原因
在game.h的类定义中,你给render()、handleEvents()、clean()这些函数直接添加了空实现({};),这属于类内函数定义。而在game.cpp中,你又再次定义了这些函数的具体实现,这就导致同一个函数被定义了两次,触发重定义错误。这和#pragma once无关,是函数声明/定义的写法错误。
解决方法
将game.h中这些函数的类内实现去掉,只保留函数声明:
修改后的game.h相关片段:
#pragma once #include "SDL2/SDL.h" class Game{ public: Game() {} ~Game() {} bool init(const char* title, int xPos, int yPos, int width,int height, int flags); // 仅保留函数声明,移除空实现 void render(); void update(); void handleEvents(); void clean(); bool running() {return m_bRunning;} private: SDL_Window* m_pWindow; SDL_Renderer* m_pRenderer; bool m_bRunning{}; };
2. init函数控制流无返回警告
错误原因
init函数返回类型为bool,但当前代码中,当SDL_Init(SDL_INIT_EVERYTHING)失败时(即if条件不成立),函数没有返回任何值,编译器因此触发警告。
解决方法
在init函数末尾添加返回语句,确保所有代码路径都有返回值:
修改后的game.cpp中init函数:
bool Game::init(const char* title, int xPos, int yPos, int width, int height, int flags){ if(SDL_Init(SDL_INIT_EVERYTHING) == 0){ std::cout << "SDL init success\n"; m_pWindow = SDL_CreateWindow(title, xPos, yPos, width, height, flags); if(m_pWindow != nullptr){ std::cout << "window creation success\n"; m_pRenderer = SDL_CreateRenderer(m_pWindow, -1, 0); if(m_pRenderer != nullptr){ std::cout << "renderer creation success\n"; SDL_SetRenderDrawColor(m_pRenderer,255,255,255,255); } else{ std::cout << "renderer failed\n"; return false; } } else{ std::cout << "SDL init fail\n"; return false; } std::cout << "Successful initialization\n"; m_bRunning = true; // 初始化成功时返回true return true; } // SDL初始化失败时返回false return false; }
3. CMakeLists.txt冗余问题修正
add_executable无需包含头文件,CMake会自动处理头文件依赖,修改后:
cmake_minimum_required(VERSION 3.0.0) project(sdl2_demo VERSION 0.1.0) # 移除src/game.h,仅保留cpp源文件 add_executable(sdl2_demo ./src/main.cpp src/game.cpp) target_link_libraries(sdl2_demo SDL2)
内容的提问来源于stack exchange,提问作者Ecburt
相关产品推荐
相关产品推荐

