2017-02-23 7 views
0

Я пытаюсь переписать часть учебника lazyfoo.net о событиях мыши только для практики. Я передумал свой дизайн после того, как кто-то на этом сайте предложил мне это сделать. Я решил попробовать добавить графический класс, а также убедиться, что члены класса не наследуются от класса, в котором они входят, что было одной из проблем в последний раз, когда я разместил вопрос. Пожалуйста, будьте терпеливы со мной, потому что я не очень опытный программист, и я нахожусь в середине обучения SDL2.0.Не объявлено в этой области, несмотря на включение правильного файла

Я запускаю Windows 10 на 64-разрядном ноутбуке Dell и используя Code :: Blocks 16.01.

Я попытался решить эту проблему, и я не думаю, что любой из вопросов, которые я нашел, относится к моей конкретной проблеме, поэтому после исправления множества других ошибок я, наконец, пришел к ошибке, что я не знаю, как исправить.

После попытки скомпилировать следующий код я получаю сообщение об ошибке, в котором говорится, что «mSpriteClips» не был объявлен в этой области », несмотря на то, что я включил CentralClass, где находится mSpriteClips, в мой файл cpp.

Вот код.

lbutton.cpp

#include "lbutton.h" 
#include "lButtonSprite.h" 
#include "global.h" 
#include "graphics.h" 
#include "ltexture.h" 
#include "central_class.h" 

LButton::LButton() 
{ 
    mButtonPosition.x = 0; 
    mButtonPosition.y = 0; 

    mCurrentSprite = button::MOUSE_OUT; 
} 

void LButton::setPosition(int x, int y) 
{ 
    mButtonPosition.x = x; 
    mButtonPosition.y = y; 
} 

void LButton::handleEvent(SDL_Event* e) 
{ 
    //If mouse event happened 
    if(e->type == SDL_MOUSEMOTION || e->type == SDL_MOUSEBUTTONDOWN || e->type == SDL_MOUSEBUTTONUP) 
    { 
     //Get mouse position 
     int x, y; 
     SDL_GetMouseState(&x, &y); 

     //Check if mouse is in button 
     bool inside = true; 

     //Mouse is left of the button 
     if(x < mButtonPosition.x) 
      inside = false; 
     //Mouse is right of the button 
     else if(x > mButtonPosition.x + global::BUTTON_WIDTH) 
      inside = false; 
     //Mouse above the button 
     else if(y < mButtonPosition.y) 
      inside = false; 
     //Mouse below the button 
     else if(y > mButtonPosition.y + global::BUTTON_HEIGHT) 
      inside = false; 

     //Mouse is outside button 
     if(!inside) 
      mCurrentSprite = button::MOUSE_OUT; 
    } 
    //Mouse is inside button 
    else 
    { 
     //Set mouse over sprite 
     switch(e->type) 
     { 
     case SDL_MOUSEMOTION: 
      mCurrentSprite = button::MOUSE_OVER_MOTION; 
      break; 

     case SDL_MOUSEBUTTONDOWN: 
      mCurrentSprite = button::MOUSE_DOWN; 
      break; 

     case SDL_MOUSEBUTTONUP: 
      mCurrentSprite = button::MOUSE_UP; 
      break; 
     } 
    } 
} 
void LButton::render(Graphics &graphics) 
{ 
    //Show current button sprite 
    mButtonSpriteSheet->render(mButtonPosition.x, mButtonPosition.y, graphics, &mSpriteClips[mCurrentSprite]); 
} 

и файл, который имеет элемент, который компилятор говорит не объявлена.

#ifndef CENTRAL_CLASS_H_INCLUDED 
#define CENTRAL_CLASS_H_INCLUDED 

#include <SDL.h> 
#include "lButtonSprite.h" 
#include "global.h" 
#include "graphics.h" 

class LButton; 

class CentralClass : public Graphics 
{ 
    // Button objects 
    LButton *mButtons[global::TOTAL_BUTTONS]; 

    // Mouse button sprite rectangles 
    SDL_Rect mSpriteClips[button::TOTAL]; 

public: 
    // Call all functions 
    CentralClass(); 

    // Starts up SDL and creates window 
    bool init(); 

    // Loads media 
    //bool loadMedia(); 

    // Main part of the program 
    void mainLoop(); 

    // Frees media and shuts down SDL 
    void close(); 

    // Clean up 
    ~CentralClass(); 
}; 

#endif // CENTRAL_CLASS_H_INCLUDED 

Любая помощь приветствуется. Я хочу, чтобы эти сообщения об ошибках действительно говорили вам, в чем проблема. Это сделает кодирование более приятным.

+0

Я не вижу, чтобы второй файл включал «central_class.h». – Shiping

ответ

4

Я получаю сообщение об ошибке, которое говорит «„mSpriteClips“не был объявлен в этой области», несмотря на то, что я включил CentralClass, который где живет mSpriteClips,

Нет, это делает не. Этот заголовочный файл не объявляет объект с именем «mSpriteClips». Он объявляет класс, который имеет член этого имени:

class CentralClass : public Graphics 
{ 
     // ... 

    SDL_Rect mSpriteClips[button::TOTAL]; 

Сведения о товаре. mSpriteClips не является глобальным объектом, он является членом класса. Ваше сообщение об ошибке, очевидно, идет отсюда:

void LButton::render(Graphics &graphics) 
{ 
    mButtonSpriteSheet->render(mButtonPosition.x, mButtonPosition.y, graphics, &mSpriteClips[mCurrentSprite]); 
} 

Этот метод вызывается в классе под названием LButton, который, очевидно, не CentralClassrender(); следовательно, наличие члена класса, относящегося к члену некоторого совершенно несвязанного класса, вряд ли удастся.

Непонятно, в чем цель этого фрагмента кода. Даже если render() может найти экземпляр класса CentralClass, он ничего не выполнит, так как mSpriteClips является частным членом класса, а LButton так и не получит доступ к этому частному члену класса.

Но это ответ на вопрос, почему вы получаете ошибку компиляции.

+0

mButtonSpriteSheet на самом деле является членом моего графического класса, а также имеет тип LTexture.Цель состоит в том, чтобы сделать кнопку определенной позиции. Простите меня, если это звучит глупо, но теперь, когда мы знаем, в чем проблема –

+0

Извините вышеприведенный комментарий. Я случайно отправил его, пока он не был закончен. Как я говорил; теперь, когда мы знаем, в чем проблема, можете ли вы сказать мне, что такое решение, потому что я здесь с полной потерей. Спасибо за помощь. –

+1

Единственный, кто может найти решение, будет вам, поскольку только у вас есть полный исходный код, и он знает, что он должен делать. Показанный код делает ссылки на различные классы и объекты, которые не показаны, и его общая цель неясна. Я hav eno идея, где этот код должен найти, что «mSpriteClips», и он даже не звучит, как будто он должен даже ссылаться на него, поскольку, как я объяснил, это недоступный частный член несвязанного класса. Вполне вероятно, что в рассматриваемом коде должен использоваться какой-то другой массив, но какой массив вы только знаете. –