尽管包含了正确的文件

时间:2017-02-23 01:30:23

标签: c++ sdl

我正在尝试重新编写lazyfoo.net的鼠标事件教程的一部分,仅用于练习。在本网站上有人建议我做之后,我重新考虑了我的设计。我已经决定尝试添加一个图形类,并确保一个类的成员不从它们所属的类继承,这是我上次发布问题时遇到的问题之一。请耐心等待我,因为我不是一个非常有经验的程序员,而且我正在学习SDL2.0。

我在64位戴尔笔记本电脑上运行Windows 10并使用Code :: Blocks 16.01。

我试过谷歌搜索这个问题,我不认为我发现的任何问题与我的具体问题有关,所以在解决了一堆其他错误后,我终于遇到了一个错误,我不知道知道如何解决。

在尝试编译以下代码后,我收到一条错误消息,上面写着"' mSpriteClips'未在此范围内宣布"尽管我将包含mSpriteClips的CentralClass包含在我的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

感谢任何帮助。我希望这些错误消息实际上告诉你问题是什么。这将使编码更加愉快。

1 个答案:

答案 0 :(得分:4)

  

我收到一条错误消息,上面写着&#34;&#39; mSpriteClips&#39;未被宣布   这个范围&#34;尽管事实上我包括了CentralClass,但是   mSpriteClips存在的地方,

不,它没有。该头文件未声明一个名为&#34; mSpriteClips&#34;的对象。它确实声明了一个恰好具有该名称成员的类:

class CentralClass : public Graphics
{
      // ...

    SDL_Rect mSpriteClips[button::TOTAL];

详情很重要。 mSpriteClips不是全局对象,它是类的成员。您的错误消息显然来自此处:

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

这个名为render()的名为LButton的方法,显然不是CentralClass;因此,有一个班级成员提到一些完全不相关的班级的成员不太可能成功。

目前尚不清楚这块代码的意图是什么。即使render()可以在某个地方找到CentralClass类的实例,也无法完成任何操作,因为mSpriteClips是私有类成员,而LButton将无法访问无论如何,对这个私人班级成员。

但是,这确实回答了为什么会出现编译错误的问题。