marc_xxx Temat założony przez niniejszego użytkownika |
[SFML] Problem ze wskaźnikami na funkcje składowe obiektu » 2016-05-15 23:09:30 Cześć. Piszę klasę przycisk. Klasa ma otrzymać jako argument swoją nazwę (to co jest napisane na przycisku) oraz akcję, która jest wykonywana po naciśnięciu. Stworzyłem klasę ButtonActions, w której są publiczne funkcje statyczne. Klasa Button (oraz jej dziecko - MainMenuButton) mają przyjąć po 2 argumenty typów std::string oraz Action - wcześniej zdefiniowany typ jako: typedef void( ButtonActions::* Action )( void ); . Mój problem polega na tym, że nie wiem jak wysłać (przypisać) owy wskaźnik na funkcję w obiekcie. Wiem, że nazwa funkcji to jest jej adres ale instrukcja ButtonActions:CloseGame nie działa (podczas tworzenia klasy MainMenuButton). Zerknijcie na mój kod - wstawiam okrojony kod, mam nadzieję, że nic ważnego nie pominę :P : Button class Button : public VInteractiveObject { public: typedef void( ButtonActions::* Action )( void ); Button( std::string ButtonTittle, Action action ); protected: Action action; };
Button::Button( std::string ButtonTittle, Action action ) { this->action = action; }
MainMenu class MainMenu { public: MainMenu(); ~MainMenu(); private: class MainMenuButton : public Button { public: MainMenuButton( std::string buttonTittle, Action action ); private: static float nextButtonPosition; }; std::vector < MainMenu::MainMenuButton > Buttons; }; MainMenu::MainMenu() { this->gameHeader.setTexture( ResourceManager::GetInstance().GetMenuHeader() ); this->Buttons.push_back( MainMenuButton( "Listen to Music", ButtonActions::Nothing ) ); this->Buttons.push_back( MainMenu::MainMenuButton( "Exit", & ButtonActions::CloseGame ) ); } MainMenu::MainMenuButton::MainMenuButton( std::string buttonTittle, Action action ) : Button( buttonTittle, action ) { this->SetPosition( 512.0f,( 384.0f + this->nextButtonPosition ) ); this->nextButtonPosition += this->buttonShape.getSize().y + 15.0f; }
ButtonAction class ButtonActions { public: static void CloseGame(); static void Nothing(); private: ButtonActions(); ~ButtonActions(); }; void ButtonActions::CloseGame() { Game::GameState = Game::EGameState::Exiting; }
void ButtonActions::Nothing() { }
|
|
pekfos |
» 2016-05-15 23:42:41 Jaki błąd? |
|
marc_xxx Temat założony przez niniejszego użytkownika |
» 2016-05-15 23:53:58 no instance of constructor "MainMenu::MainMenuButton::MainMenuButton" matches the argument list symulator_informatyka arguments are: (const char [X], void (*)() Problem jest z definicją wskaźnika albo podczas wysyłania, ale nie mam pojęcia jak to zrobić - nigdy nie używałem wskaźników na funkcje, a tym bardziej na funkcje składowe. |
|
pekfos |
» 2016-05-15 23:57:22 static void CloseGame(); static void Nothing(); |
Wywal static. |
|
marc_xxx Temat założony przez niniejszego użytkownika |
» 2016-05-16 00:05:30 Dzięki, teraz działa, ale nie rozumiem dlaczego - przecież nie istnieje, żaden egzemplarz klasy to i funkcje też mają przypisanego miejsca w pamięci. A jak teraz wywołać tą funkcję? :P |
|
pekfos |
» 2016-05-16 00:08:21 nie rozumiem dlaczego - przecież nie istnieje, żaden egzemplarz klasy to i funkcje też mają przypisanego miejsca w pamięci. |
Nie znam tego języka, przetłumacz na polski. A jak teraz wywołać tą funkcję? :P |
Wynalazłeś przed chwilą wskaźniki na funkcje od nowa? W innym wypadku nie widzę możliwości, byś wiedział jak wyglądają, nie wiedząc nawet gdzie znaleźć informacje, jak ich dalej użyć. |
|
marc_xxx Temat założony przez niniejszego użytkownika |
» 2016-05-16 00:11:32 nie rozumiem dlaczego - przecież nie istnieje, żaden egzemplarz klasy to i funkcje też NIE mają przypisanego miejsca w pamięci :) |
|
pekfos |
» 2016-05-16 00:16:22 Dalej źle. przecież nie istnieje żaden egzemplarz klasy, to i funkcje też nie mają przypisanego miejsca w pamięci. |
Jak to funkcja może nie mieć przypisanego miejsca w pamięci? To co trzymasz w tych wskaźnikach? Obietnice wyborcze..? |
|
« 1 » 2 |