Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[C++/SFML] Odwołanie się do metody statycznej

Ostatnio zmodyfikowano 2013-04-16 22:54
Autor Wiadomość
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

C/C++
#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 // IMAGEMANAGER_H

C/C++
void MenuState::Init() {
    //sf::Image Image = ImageManager::GetImage("GFX/MenuBackground.bmp");
    Spr.SetImage( ImageManager::GetImage( "GFX/MenuBackground.bmp" ) ); //w zaden sposob nie moge sie odwolac
}

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?
P-80679
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.
P-80683
akwes
» 2013-04-16 22:00:07
Szukałeś na forum? Zmienne statyczne w klasie
P-80685
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..
P-80689
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ęść".
P-80692
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)
P-80693
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.
P-80694
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 :)
P-80695
« 1 » 2
  Strona 1 z 2 Następna strona