"функция "Game::Game(void)" уже имеет текст реализации", "Game: не является именем класса или пространства имен" и таких 16 ошибок, как решить?

я имею три headera: Game.h , GameObject.h , TextureManager.h; также имею 4 файла формата .cpp : main.cpp , Game.cpp, GameObject.cpp,TextureManager.cpp;

Game.h

:

#pragma once
#include "SDL_image.h"
#include "SDL.h"
#include"TextureManager.h"
#include<iostream>
#include"GameObject.h"
using namespace std;
class Game {
public:
Game() {};
~Game() {};
void init(const char* title, int xpos, int ypos, int width, int height, bool 
fullscreen) {};
void handleEvents() {};
void update() {};
void render() {};
void clean() {};
bool running() { return isRunning; };
static SDL_Renderer* renderer;
private:
int count = 0;
bool isRunning;
SDL_Window* window = nullptr;
};

Вот

Game.cpp

:

#include"Game.h"

Game::Game() {};
Game::~Game() {};
GameObject* Frodo;
void Game::init(const char* title, int xpos, int ypos, int width, int height, bool 
fullscreen) 
{

int flags = 0;
if (fullscreen)
{
    flags = SDL_WINDOW_FULLSCREEN;
}
if (SDL_Init(SDL_INIT_EVERYTHING) == 0)
{
    cout << "Subsystems initialized" << endl;
    window = SDL_CreateWindow(title, xpos, ypos, width, height, flags);
    if (window)
    {
        cout << "Window created" << endl;
    }
    renderer = SDL_CreateRenderer(window, -1, 0);
    if (renderer)
    {
        SDL_SetRenderDrawColor(renderer, 255, 255, 255, 255);
        cout << "Renderer created" << endl;
    }
    isRunning = true;
}
else
    isRunning = false;
Frodo = new GameObject("D:\\Lotr_game\\images\\Charackters\\Frodo_png.png", 0, 0);

};

void Game::handleEvents() 
{
SDL_Event event;
SDL_PollEvent(&event);
switch (event.type)
{
case SDL_QUIT:
    isRunning = false;
    break;

default:
    break;
}

};

void Game::update() 
{
count++;
Frodo->Update();
cout << count << endl;
};

void Game::render() 
{
SDL_RenderClear(renderer);
Frodo->Render();
SDL_RenderPresent(renderer);
};

void Game::clean() 
{
SDL_DestroyWindow(window);
window = nullptr;
SDL_DestroyRenderer(renderer);
renderer = nullptr;
SDL_Quit();
cout << "Game cleaned" << endl;
};

Вот

GameObject.h

:

#pragma once
#include"Game.h"


SDL_Renderer *Game::renderer = nullptr;
class GameObject
{
public:
   GameObject(const char* texturesheet, int x, int y){};
~GameObject() {};
void Update() {};
void Render() {};

private:
   int xpos;
   int ypos;
   SDL_Texture *objTexture;
   SDL_Rect srcRect, destRect;
};

Вот

GameObject.cpp

:

#include "GameObject.h"
#include"TextureManager.h"

GameObject::GameObject(const char* texturesheet, int x, int y)
{
objTexture = TextureManager::LoadTexture(texturesheet);
xpos = x;
ypos = y;
};
GameObject::~GameObject() {};
void GameObject::Update()
{
xpos++;
ypos++;
srcRect.h = 200;
srcRect.w = 133;
srcRect.x = 0;
srcRect.y = 0;

destRect.x = xpos;
destRect.y = ypos;
destRect.h = srcRect.h * 2;
destRect.w = srcRect.w * 2;
};
void GameObject::Render()
{
SDL_RenderCopy(Game::renderer, objTexture, &srcRect, &destRect);
};

Вот

TextureManager.h

:

#pragma once
#include"Game.h"
class TextureManager
{
public:
   static SDL_Texture* LoadTexture(const char* texture){}
};

Вот

TextureManager.cpp

:

#include"TextureManager.h"
SDL_Texture* TextureManager:: LoadTexture(const char* texture)
{
    SDL_Surface* tmpSurface = IMG_Load(texture);
    SDL_Texture* tex = SDL_CreateTextureFromSurface(Game::renderer, tmpSurface);
    SDL_FreeSurface(tmpSurface);
    return tex;
}

Вот

main.cpp

:

#include"Game.h"

Game *game = nullptr;



int main(int argc,  char* args[])
{
const int FPS = 60;
const int frameDelay = 1000 / FPS;

Uint32 framestart;
int frameTime;
game = new Game();
game->init("LOTR",SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 800, 640, false);
while (game->running())
{
    framestart = SDL_GetTicks();
    game->handleEvents();
    game->update();
    game->render();
    frameTime = SDL_GetTicks() - framestart;
    if (frameDelay > frameTime)
    {
        SDL_Delay(frameDelay - frameTime);
    }
}

game->clean();
return 0;
}

Ответы (1 шт):

Автор решения: Harry

По первому вопросу — об "уже имеет текст реализации": вы в классе определили конструктор-деструктор с пустым телом:

class Game {
public:
Game() {};
~Game() {};

А потом еще раз определили их

#include"Game.h"

Game::Game() {};
Game::~Game() {};
GameObject* Frodo;

и тем самым нарушили правило одного определения...

→ Ссылка