pjpeg_objected Temat założony przez niniejszego użytkownika |
[C++/SFML] Odwołanie się do metody statycznej » 2013-04-16 21:07:51 Witam. Otóż mam klasę ImageManager w której mam metodę GetImage() i jest ona metodą statyczną. Chciałbym się do niej odwołać z poziomu klasy lecz niestety kompilator mi na to nie pozwala: ||warning: auto-importing has been activated without --enable-auto-import specified on the command line.| obj\Debug\MenuState.o:C:\Documents and Settings\oFFix\Moje dokumenty\C++ Projects\TowerDefence\ImageManager.h|15|undefined reference to `ImageManager::Images'| obj\Debug\MenuState.o:C:\Documents and Settings\oFFix\Moje dokumenty\C++ Projects\TowerDefence\ImageManager.h|16|undefined reference to `ImageManager::Images'| ||Info: resolving vtable for sf::Sprite by linking to __imp___ZTVN2sf6SpriteE | ||=== Build finished: 2 errors, 1 warnings ===|
Oto kod ( w headerze MenuState oczywiście załączam ImageManager.h): ImageManager.h #ifndef IMAGEMANAGER_H #define IMAGEMANAGER_H #include <SFML/Graphics.hpp> #include <string> #include <vector>
using namespace std;
class ImageManager { public: static sf::Image & GetImage( string filename ) { sf::Image Image; Image.LoadFromFile( filename ); Images[ filename ] = Image; return Images[ filename ]; } private: static std::map < std::string, sf::Image > Images; };
#endif
void MenuState::Init() { Spr.SetImage( ImageManager::GetImage( "GFX/MenuBackground.bmp" ) ); }
Dodam również, że wcześniej przekazywałem tą funkcję jako parametr w funkcji głównej lecz teraz korzystam z metod wirtualnych i raczej nie ma takiej opcji, dlatego jestem świeży w temacie metod statycznych (lecz czytałem o nich dużo). Chciałbym jeszcze zapytać czy taki ImageManager powinien być metodą statyczną, singletonem czy może czymś innym? |
|
Monika90 |
» 2013-04-16 21:40:59 no przecież masz tam napisane undefined reference to `ImageManager::Images'
musisz zdefiniować składową ImageManager::Images w którejś z jednostek translacji. |
|
akwes |
» 2013-04-16 22:00:07 |
|
pjpeg_objected Temat założony przez niniejszego użytkownika |
» 2013-04-16 22:17:05 Dziękuje za odpowiedź. Szukałem tylko pod innymi słowami kluczowymi. Zastanawia mnie jeszcze jedna rzecz, a mianowicie jaki typ zmiennej powinienem podać przy definicji, bo kiedy podaje std::map prosi o listę argumentów ( std::map ImageManager::Images) a jak podam argumenty to kompilator ma problem z multiple definition.. |
|
akwes |
» 2013-04-16 22:33:22 A na pewno dobrze określasz zakres (Nazwaklasy::) zmiennej podczas definiowania? Nie należy też drugi raz podawać modyfikatora "static", co też w temacie wyszło :)
// Edit, oraz czy dobrze określasz typ zmiennej, w sensie, czy cały typ podajesz, bo std::map, to tylko "część". |
|
pjpeg_objected Temat założony przez niniejszego użytkownika |
» 2013-04-16 22:35:47 Próbowałem std::map ImageManager::Images albo tak samo tylko z argumentami. A statica nie używam :( Z góry dziękuje za pomoc.
//edit no próbuje też podać tak std::map <std::string, sf::Image > ImageManger::Images ale to jest chyba nieprawidłowe.. ( kompilator wywala błąd) |
|
akwes |
» 2013-04-16 22:37:49 Podaj dokładnie, jak brzmiała druga metoda, którą próbowałeś. Ta z "argumentami"?
// Edit, to podaj jeszcze, jaki dokładnie błąd Ci wywala. |
|
pjpeg_objected Temat założony przez niniejszego użytkownika |
» 2013-04-16 22:43:59 obj\Debug\main.o||In function `main':| C:\Documents and Settings\oFFix\Moje dokumenty\C++ Projects\TowerDefence\main.cpp|4|multiple definition of `ImageManager::Images'| obj\Debug\MenuState.o:C:\Documents and Settings\oFFix\Moje dokumenty\C++ Projects\TowerDefence\MenuState.cpp|5|first defined here| ||warning: auto-importing has been activated without --enable-auto-import specified on the command line.| ||Info: resolving vtable for sf::Sprite by linking to __imp___ZTVN2sf6SpriteE | ||=== Build finished: 2 errors, 1 warnings ===|
//Edit Prawdopodobnie znalazłem błąd. Załączałem ImageManager.h w headerze MenuState zamiast w MenuState.cpp, choć myślałem że tak będzie działać. Ale i tak wielkie dzięki za pomoc :) |
|
« 1 » 2 |