Class has not been declared

Le problème exposé dans ce sujet a été résolu.

Bonjour ! J’avais déjà posé une question pour un problème sur mon projet (par rapport à des unique_ptr), mais cette fois-ci, j’ai une autre erreur : J’ai une classe TextureManager qui, comme son nom l’indique, gère les textures. J’ai une autre classe, Sprite, qui elle gère les données du sprite d’une entité. Voici cette classe :

#pragma once
 
#include <string>
#include <iostream>
#include <SDL2/SDL.h>
 
#include "ECS.h"
#include "Engine.h"
#include "Component.h"
#include "UptrSdl2.h"
 
#include "TextureManager.h"
 
class Sprite : public Component {
    public:
        Sprite() = default;
        Sprite(SDL_Renderer* target, std::string id) : renderTarget(target), textureID(id) {}
        virtual ~Sprite() = default;
 
        void init() override final {
            texture = TextureManager::get().getTexture(textureID); //l'erreur me renvoie ici
            SDL_QueryTexture(texture,nullptr,nullptr,&width,&height);
 
            dest.x = entity->getComponent<Transform>().position.x;
            dest.y = entity->getComponent<Transform>().position.y;
            dest.w = width*entity->getComponent<Transform>().scale.x;
            dest.h = height*entity->getComponent<Transform>().scale.y;
 
            src.x = 0;
            src.y = 0;
            src.w = width;
            src.h = height;
        }
 
        void updateDestRect() {
            dest.x = entity->getComponent<Transform>().position.x;
            dest.y = entity->getComponent<Transform>().position.y;
            std::cout << entity->getComponent<Transform>().scale.x << " " << entity->getComponent<Transform>().scale.y << std::endl;
            dest.w = width*entity->getComponent<Transform>().scale.x;
            dest.h = height*entity->getComponent<Transform>().scale.y;
        }
 
        int width = 0;
        int height = 0;
        SDL_Rect src = {0,0,0,0};
        SDL_Rect dest = {0,0,0,0};
 
        std::string textureID = "";
        SDL_Texture* texture = nullptr;
        SDL_Renderer* renderTarget = nullptr;
        SDL_RendererFlip flip = SDL_FLIP_NONE;
};

Lorsque je compile, il me renvoie une erreur dans cette classe, qui me dit "TextureManager has not been declared", sauf que j’ai bien inclus TextureManager dans ce fichier, et ma classe TextureManager est bien implémentée… Quel serait le problème ? ^^'

Merci d’avance pour votre aide !

Pas de soucis, le voilà :

TextureManager.h

#pragma once

#include <map>
#include <string>
#include <iostream>
#include <exception>
#include <stdexcept>
#include <SDL2/SDL.h>
#include <SDL2/SDL_ttf.h>
#include <SDL2/SDL_image.h>

#include "Engine.h"
#include "UptrSdl2.h"

class TextureManager {
    public:
        virtual ~TextureManager() = default;

        SDL_Texture* getTexture(std::string id);
        void loadTexture(std::string id, std::string path);

        TTF_Font* getFont(std::string id);
        void loadFont(std::string id, std::string path,int fontsize);

        inline static TextureManager& get() {
            static TextureManager tm;
            return tm;
        }

    private:
        TextureManager() {
            init();
        }
        void init();

        std::map<std::string,sdl2::FontPTR> fonts;
        std::map<std::string,sdl2::TexturePTR> textures;
};

TextureManager.cpp

#include "TextureManager.h"

SDL_Texture* TextureManager::getTexture(std::string id) {
    if(textures.count(id) > 0) {
        return textures.at(id).get();
    }
    return nullptr;
}

void TextureManager::loadTexture(std::string id, std::string path) {
    if(textures.count(id) <= 0) {
        sdl2::TexturePTR newTexture = sdl2::TexturePTR{IMG_LoadTexture(Engine::get().getRenderer(),path.c_str())};
        if(newTexture != nullptr) {
//            textures[id] = newTexture;
            textures.emplace(id,std::move(newTexture));

            std::string log = "In TextureManager (loadTexture): ";
            log += std::string{"Texture (" + path + ") loaded."};
            std::cout << log << std::endl;
        } else {
            std::string error = "In TextureManager (loadTexture): ";
            error += std::string{IMG_GetError()};
            std::cerr << error << std::endl;

            throw std::runtime_error(error);
        }
    }
}

TTF_Font* TextureManager::getFont(std::string id) {
    return (fonts.count(id) > 0 ? fonts[id].get() : nullptr);
}

void TextureManager::loadFont(std::string id, std::string path, int fontsize) {
    if(fonts.count(id) <= 0) {
        sdl2::FontPTR newFont = sdl2::FontPTR{TTF_OpenFont(path.c_str(),fontsize)};
        if(newFont != nullptr) {
//            fonts[id] = newFont;
            fonts.emplace(id,std::move(newFont));

            std::string log = "In TextureManager (loadFont): ";
            log += std::string{"Font (" + path + ") loaded."};
            std::cout << log << std::endl;
        } else {
            std::string error = "In TextureManager (loadFont): ";
            error += std::string{TTF_GetError()};
            std::cerr << error << std::endl;

            throw std::runtime_error(error);
        }
    }
}

void TextureManager::init() {
    if(TTF_Init() != 0) {
        std::string error = "In TextureManager (init #ttf): ";
        error += std::string{TTF_GetError()};
        std::cerr << error << std::endl;

        throw std::runtime_error(error);
    }

    auto imgFlags = IMG_INIT_JPG|IMG_INIT_PNG;
    auto initted = IMG_Init(imgFlags);
    if((initted&imgFlags) != imgFlags) {
        std::string error = "In TextureManager (init #img): ";
        error += std::string{IMG_GetError()};
        std::cerr << error << std::endl;

        throw std::runtime_error(error);
    }
}

Excusez-moi pour le retard sur la réponse j’avais pas mal de taf j’ai pas pensé à vérifier mon topic :p

Je vois rien d’évident qui pourrait causer l’erreur que tu indiques dans ce que tu montres.

Le seul truc qui me semble plausible, c’est le cas d’une dépendance circulaire. Par exemple, si Engine.h inclue directement ou indirectement TextureManager.h, tu peux te retrouver avec exactement l’erreur que tu décris. Le même genre de problème peut arriver en utilisant mal des include guard, mais #pragma once devrait fonctionner.

De manière plus générale, il y a probablement un problème qui fait que ton #include "TextureManager.h" n’inclue rien (ou pas le bon fichier). Suivant le compilateur que tu utilises, tu devrais avoir moyen d’afficher des informations de debug sur ce qu’il se passe lors de l’étape du préprocesseur.

Bah j’utilise Code::Blocks, et j’ai activé les avertissements supplémentaires du compilateur (extra compiler warnings [-Wextras] sur Code::Blocks) mais il me dit rien de spécial (si c’est bien de ça que tu parles) :p

Je vais essayer de mettre le include dans l’implémentation de Engine au lieu de son header, en mettant class TextureManager; dans le header, si ça change quelque chose je vous dis quoi, mais j’y crois pas trop :p

====================================================

EDIT : Le problème était que Sprite incluait Engine et inversement, j’ai réglé le problème en mettant class Sprite; dans Engine.h et #include "Sprite.h" dans Engine.cpp :p Par contre maintenant quand je lance mon programme, la fenêtre ne réponds pas et au final une fois que ma fenêtre se ferme il me donne l’erreur -805306369 (0xCFFFFFFF) ^^'

+0 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte