未解決の外部シンボル エラーがあり、頭がおかしくなりました。つまり、SDL_Surfaces ('DgSurface') のラッパー クラスと、DgSurfaces ('DgSurfaceList') を読み込んで保存するクラスがあります。プロジェクトに DgSurfaceList ファイルを含めようとすると、リンクの問題が発生します。ここに私のクラスがあります:
ヘッダー ファイル「DgSurface.h」には、DgSurface クラス宣言が含まれています。
#ifndef DGSURFACE_H
#define DGSURFACE_H
#include "SDL.h"
#include <string>
class DgSurface
{
public:
//Constructor/destructor
DgSurface(std::string N, SDL_Surface* I): image(I), name(N) {}
DgSurface() {name = ""; image = NULL;}
~DgSurface();
//Copy operations
DgSurface(const DgSurface&);
DgSurface& operator= (const DgSurface&);
//Data members
std::string name; //The name of the image
SDL_Surface* image; //The image
};
#endif
cpp ファイル「DgSurface.cpp」には、DgSurface 定義が含まれています。
#include "DgSurface.h"
#include "SDL.h"
//--------------------------------------------------------------------------------
// Constructor
//--------------------------------------------------------------------------------
DgSurface::DgSurface(const DgSurface& other)
{
//Copy name
name = other.name;
//Create new SDL_Surface
image = SDL_ConvertSurface(other.image, other.image->format, 0);
}
//--------------------------------------------------------------------------------
// Destructor
//--------------------------------------------------------------------------------
DgSurface::~DgSurface()
{
SDL_FreeSurface(image);
}
//--------------------------------------------------------------------------------
// Assignment operator
//--------------------------------------------------------------------------------
DgSurface& DgSurface::operator= (const DgSurface& other)
{
// if same object
if ( this == &other )
return *this;
//Copy name
name = other.name;
//Create new SDL_Surface
image = SDL_ConvertSurface(other.image, other.image->format, 0);
return *this;
}
このクラスは正常に動作しているようで、期待どおりに動作します (ただし、いつものように、フィードバックを受け付けています :)。
「DgSurfaceList.h」には、DgSurfaceList クラス宣言が含まれています。
#ifndef DGSURFACELIST_H
#define DGSURFACELIST_H
#include "SDL.h"
#include <list>
#include <string>
#include "DgSurface.h"
class DgSurfaceList
{
public:
//Constructors/destructor
DgSurfaceList() {}
~DgSurfaceList() {}
//Functions
bool AddImage(std::string location, std::string name);
//Return Functions
SDL_Surface* GetImage(std::string S) const;
private:
//Data members
std::list<DgSurface> imlist; //The list of DgSurfaces
//Functions
SDL_Surface* LoadImage( std::string filename );
};
#endif
最後に、「DgSurfaceList.cpp」には DgSurfaceList 定義が含まれています。
#include "SDL.h"
#include "SDL_image.h"
#include <list>
#include <string>
#include "DgSurface.h"
#include "DgSurfaceList.h"
//--------------------------------------------------------------------------------
// Load an image from file
//--------------------------------------------------------------------------------
SDL_Surface* DgSurfaceList::LoadImage( std::string filename )
{
//Loads an image from file, returns SDL_surface*
...
} //End:DgSurfaceList::LoadImage()
//--------------------------------------------------------------------------------
// Add a DgSurface to the list
//--------------------------------------------------------------------------------
bool DgSurfaceList::AddImage(std::string location, std::string name)
{
//Load the image
DgSurface temp(name,LoadImage(location));
//If there was an error in loading the image
if( temp.image == NULL )
return false;
//If everything loaded fine, place a copy into imlist
imlist.push_back(temp);
return true;
} //End: DgSurfaceList::AddImage();
//--------------------------------------------------------------------------------
// Searches imlist for an image, returns a pointer to a SDL_Surface
//--------------------------------------------------------------------------------
SDL_Surface* DgSurfaceList::GetImage(std::string S) const
{
std::list<DgSurface>::const_iterator i;
//Search imlist for DgSurface of the same name
for (i = imlist.begin(); i != imlist.end(); i++)
{
if (S.compare((*i).name) == 0)
return (*i).image;
}
//Return Null if name not found
return NULL;
} //End:DgSurfaceList::GetImage()
ここで、cpp ファイルの DgSurfaceList::GetImage() 定義をコメント アウトすると、DgSurfaceList は正常に動作し、画像を正しく保存するように見えます。より具体的には、上記の関数に for ループを含めた場合にのみ、リンク エラーが発生します。どうなり得るか?
他の情報:
エラー:
unresolved external symbol __imp___CrtDbgReportW referenced in function "public: class
DgSurface const & __thiscall std::_List_const_iterator<class std::_List_val<class
DgSurface,class std::allocator<class DgSurface> > >::operator*(void)const "
コーディング環境: Visual C++ Express 2010