2012-08-12 32 views
7

Bana somurtma yapan çözülmemiş bir dış simge hatası var. Kısacası, SDL_Surfaces ('DgSurface') için bir sarmalayıcı sınıfım ve DgSurfaces ('DgSurfaceList') yüklemek ve saklamak için bir sınıfım var. Bağlantı sorunu, projemde DgSurfaceList dosyalarını dahil etmeye çalışırken ortaya çıkar. İşte benim sınıfları şunlardır:çözümlenmemiş harici

#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 dosyası "DgSurface.cpp" contatins DgSurface tanımları:

#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; 
} 

başlık dosyası "DgSurface.h" DgSurface sınıfı bildirim içeriyor

Bu sınıf iyi çalışıyor ve beklendiği gibi çalışıyor (ancak, her zaman olduğu gibi, geri bildirime açığım :). Ben DgSurfaceList dışarı yorum yaparsanız Şimdi

#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() 

:: getImage:

"DgSurfaceList.h" DgSurfaceList sınıf bildirimleri içerir: nihayet

#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 

ve "DgSurfaceList.cpp" DgSurfaceList tanımlarını içeren() cpp dosyasındaki() tanım, DgSurfaceList iyi çalışıyor ve görüntüleri doğru şekilde saklıyor. Daha spesifik olarak, bağlantı hatası sadece yukarıdaki döngüde for döngüsü içerdiğimde ortaya çıkar. Ne olabilirdi?

Diğer bilgi:

Hata:

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 " 

Kodlama ortamı: Visual C 2010

cevap

11

CrtDbgReport ifade ++ sadece C çalışma zamanı kütüphanesinin ayıklama sürümünde tanımlanır. Bu yüzden belki de hata ayıklama modunda derliyorsunuz ancak kütüphanenin yayın sürümü ile bağlantı kuruyorsunuz. Diğer bir olasılık ise, sürüm modunda derlemenizdir, ancak tanımladığınız bazı makrolar, std :: list dosyasının hata ayıklama sürümünün derlenmesine neden olmaktadır.

+3

Teşekkürler, Özellikler -> C/C++ -> Kod Üretimi -> Çalışma Zamanı Kitaplığı'nı Mt Debug DLL'sine ayarlıyorum ve şimdi derleyim. Bunun neden böyle olduğundan emin değilim, ama içine bakacağım. – Frank

+2

Ayrıca bu sorunu destek ve opencv birlikte kullanarak vardı. _DEBUG veya NDEBUG bayrakları ile ilgili olası açıklamalar var, benim durumumda bu konuda hiçbir etkisi yok. İkinize de teşekkürler. –

+1

_DEBUG’in NDEBUG’e değiştirilmesi son baş ağrımızı çözdü. Teşekkürler! – Jon