1

このエラーに関する他の質問を調べましたが、役に立ちません。私はまだ C++ に不慣れで、何かを誤解しているのか、何かを誤用しているのか、単に何かを見逃しているのかわかりませんが、何がわからないので助けが必要です。私が得ている私のエラーは

SpriteImage はタイプに名前を付けません

スプライト.cpp

#include "Sprite.h"
#include "SDL/SDL.h"
#include "SDL/SDL_image.h"
#include <iostream>
#include <vector>

namespace ColdFusion
{
Sprite::Sprite()
{
    bufferSize = 100;
}

void Sprite::addToBuffer(SpriteImage img)
{
    if(SpriteBuffer->size() == bufferSize)
    {
        bufferSize *= 2;
        SpriteBuffer->resize(bufferSize);
    }
    SpriteBuffer->push_back(img);
}

SpriteImage Sprite::getFromBuffer(int index) //**Here is the error**
{
    return SpriteBuffer[index];
}

void Sprite::removeFromBuffer(int index)
{
    SpriteBuffer->erase(SpriteBuffer.begine()+index);
}

void Sprite::removeFromBuffer(SpriteImage index)
{
    for(int j = 0; j <= SpriteBuffer->size(); j++)
    {
        if(SpriteBuffer[j].name == index.name)
        {
            removeFromBuffer(j);
        }
    }
}

void Sprite::applyToScreen(SpriteImage img, SDL_Surface* destination)
{
    applyImage(img.x, img.y,getImage(img.filepath),destination)
}

SDL_Surface* Sprite::getImage(std::string filepath)
{
    SDL_Surface* optimized = NULL;
    SDL_Surface* loaded = NULL;
    loaded = IMG_Load(filepath.c_str());

    if(loaded != NULL)
    {
        optimized = SDL_DisplayFormat(loaded);
        SDL_FreeSurface(loaded);
        return optimized;
    }
    return NULL;
}

void Sprite::applyImage(int x, int y, SDL_Surface* source, SDL_Surface* destination)
{
    SDL_Rect offset;
    offset.x = x;
    offset.y = y;
    SDL_BlitSurface(source, NULL, destination, &offset);
}

Sprite::~Sprite()
{

}
}

Sprite.h

#ifndef SPRITE_H
#define SPRITE_H

#include "SDL/SDL.h"
#include <iostream>
#include <vector>

namespace ColdFusion
{
class Sprite
{
    public:
        Sprite();
        ~Sprite();
        typedef struct SpriteImage{
            int x;
            int y;
            std::string name;
            std::string filepath;
        };
        void addToBuffer(SpriteImage img);
        SpriteImage getFromBuffer(int index);
        void removeFromBuffer(int index);
        void removeFromBuffer(SpriteImage index);
        void applyToScreen(SpriteImage img, SDL_Surface* destination);

    protected:
    private:
        int bufferSize;
        std::vector<SpriteImage> SpriteBuffer[100];
        SDL_Surface* image;
        SDL_Surface* getImage(std::string filepath);
        void applyImage(int x, int y, SDL_Surface* source, SDL_Surface* destination);

};
}

#endif
4

2 に答える 2

4

SpriteImageネストされた型であり、含まれているクラスのスコープ外にいる場合、それにアクセスするには、周囲のクラスの名前で修飾する必要があります。を使用しSprite::SpriteImageます。多くのコピー構築を避けるために、パラメーターをaddToBufferbyにすることも理にかなっています。const&(おそらくそれらは最適化されて取り除かれることになりますが、それは良い習慣です)。

生の配列の代わりに、std::arrayまたはを使用することもできますboost::array。ただし、宣言std::vector<SpriteImage> SpriteBuffer[100];はおそらく、あなたが思っていることを宣言していません。

于 2012-07-23T15:35:25.207 に答える
3

戻り値の型として使用する場合、クラスの名前空間にないため、次のように修飾する必要がありますSpriteImage

Sprite::SpriteImage Sprite::getFromBuffer(int index) //**Here is the error**
{
    return SpriteBuffer[index];
}
于 2012-07-23T15:36:53.317 に答える