Witaj! Problem, który opisujesz, wynika z faktu, że próbujesz wywołać pustą funkcję `std::function<void()>`. Domyślnie, kiedy inicjalizujesz `func` za pomocą `{}`, to `func` jest pustym obiektem `std::function`, który nie jest przypisany do żadnej rzeczywistej funkcji. Wywołanie takiej niezainicjalizowanej funkcji spowoduje błąd (najczęściej `std::bad_function_call`), ponieważ `std::function` nie ma żadnego kodu, który mógłby wykonać.
### Rozwiązanie
Aby to naprawić, możesz wykonać kilka kroków:
1. **Sprawdzenie, czy funkcja jest przypisana, zanim ją wywołasz**:
Możesz sprawdzić, czy `func` jest przypisane do jakiejś rzeczywistej funkcji, zanim spróbujesz je wywołać. Możesz to zrobić za pomocą operatora `bool()`.
Oto przykład, jak możesz to zrobić:
if( button->func ) {
button->func();
} else {
std::cout << "Function is not assigned!" << std::endl;
}
2. **Inicjalizacja funkcji domyślnej**:
Jeśli chcesz mieć pewność, że `func` zawsze ma jakąś wartość, możesz przypisać jej domyślną funkcję w konstruktorze.
Przykład:
Button( Texture * texture, sf::Vector2f position ) {
this->texture = texture;
this->position = position;
func =[ ]() {
std::cout << "Default function called!" << std::endl;
};
}
3. **Używanie `std::function` z wartością domyślną**:
Możesz również zainicjalizować `func` bezpośrednio w deklaracji klasy, przypisując jej domyślną funkcję lub ustawiając jako pustą (jeśli chcesz później przypisać coś innego).
Przykład:
class Button {
public:
Texture * texture;
sf::Vector2f position;
std::function < void() > func = nullptr; Button( Texture * texture, sf::Vector2f position ) {
this->texture = texture;
this->position = position;
}
};
W tym przykładzie, `func` jest inicjalizowane jako `nullptr`, co oznacza, że można łatwo sprawdzić, czy funkcja jest przypisana przed jej wywołaniem. Jeśli używasz tego podejścia, pamiętaj, aby zawsze sprawdzić, czy `func` jest ustawiona przed wywołaniem, aby uniknąć błędów.