Ошибка относительно объема двух классов - PullRequest
1 голос
/ 21 декабря 2011

У меня есть класс с именем Engine.Объект класса TextureManager находится внутри класса Engine, а также объект класса Window.

Моя проблема заключается в том, что функции внутри TextureManager не могут получить доступ к открытым функциям или переменным внутри класса Window.

Это предназначенная особенность C ++ или вы думаете, что я неправильно объявляю / определяю один или оба этих объекта.

Как вы можете видеть, внутри движка есть TextureManager и Window.

class Engine
{
  public:
        Engine();
        ~Engine();


        Window gameWindow;
        TextureManager textures;

        SDL_Event event;

        int test;
};

Вот заголовок для класса Window

class Window
{
  public:
        //Constructors
        Window();
        ~Window();

        //Getter Functions
        SDL_Surface * get_screen();

        //Other Functions
        void toggle_fullscreen();
        void render();
        void initialize(int screenwidth, int screenheight);
        bool handle_events(SDL_Event event);
        bool check_error();

  private:
        bool windowed;
        bool windowFailure;

        int screenWidth;
        int screenHeight;

        SDL_Surface * screen;

};

Вот заголовочный файл для класса TextureManager

class TextureManager
{
  public:
        TextureManager();
        ~TextureManager();

        int new_texture(std::string filename);
        int new_section(int indexOfTexture, int x, int y, int width, int height);

        void render_texture(int textureID, int x, int y);
        void render_section(int textureSectionID, int x, int y);
  private:
        std::vector< Texture > textureIDs;
        std::vector< TextureSection > textureSectionIDs;
};

И это функция I 'У меня проблемы с.У меня ошибка при доступе к gameWindow в вызове функции SDL_BlitSurface ()

void TextureManager::render_texture(int textureID, int x, int y)
{
  SDL_Rect coordinates;
  coordinates.x = x;
  coordinates.y = y;
  SDL_BlitSurface(textureIDs[textureID].get_texture(), NULL, gameWindow.get_screen(), &coordinates);
} 

Ответы [ 2 ]

2 голосов
/ 21 декабря 2011

Как уже говорилось, экземпляр TextureManager не знает об экземпляре gameWindow класса Window.Вы можете рассмотреть следующий подход, чтобы разрешить TextureManager взаимодействовать с gameWindow:

class TextureManager {
public:
    TextureManager(Window& w) : m_refWindow(w) { /*...*/ }
    /*...*/
protected:
    Window& m_refWindow;
    /*...*/
}

void TextureManager::SomeMethod()
{
    m_refWindow.DoSomething();
}

Engine::Engine() :
    gameWindow(),
    textures(gameWindow)
{
 /*...*/
}

Таким образом, объект textures будет привязан к объекту gameWindow и сможет вызывать его открытые функции.

1 голос
/ 21 декабря 2011

TextureManager не знает, что он используется как переменная-член Engine, поэтому он не знает, что такое gameWindow.

Примите во внимание тот факт, что вы можете создать экземпляр TextureManagerгде угодно, включая контексты, где gameWindow нет вообще.Функция-член может «видеть» только локальные переменные, глобальные переменные или свои собственные переменные-члены.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...