argument konstruktora jako wskaźnik do metody

1

Witam wszystkich serdecznie dawno mnie tu nie było ;).
Mam problem ponieważ, chcę utworzyć w klasie A konstruktor który przyjmuje jako parametr wskaźnik do metody.
Niestety gdy w klasie B tworze obiekt wyrzuca mi błąd. Proszę o poradę.

Pozdrawiam

typedef void(*fun)();


class A
{
public:
	A( fun) {};
	A() {};
};

class B
{
public:
	void d() {};
	void c()
	{
		 A a = A(d);
	}
};
error: dla A a = A(d);
E0289	no instance of constructor "A::A" matches the argument. argument types are: (void())
1

"Luźna" funkcja jest czymś innym niż funkcja w klasie (która przecież niejawnie przyjmuje również this - obiekt klasy - jako parametr). Stąd typ funkcji d w klasie B to void (B::*)() i nie zbindujesz tego do void(*)(). Powiedz nam czym ma być funkcja, którą chcesz przyjąć w konstruktorze. Dowolnym callbackiem zwracającym void i nie przyjmującym argumentów?

https://isocpp.org/wiki/faq/pointers-to-members

0

Tworzę klasę Button w SFML-u i chciałem jako parametr konstruktora podać akcję która wykona się w przypadku detekcji kliknięcia.
Klasa nazwijmy ja "Window", bedzie posiadać taki przycisk i w momencie kliknięcia przycisku wykona sie w obiekcie Window jakas metoda podana wcześniej konstruktorowi Button. np. wyświetli mi tekst na ekranie. W C# załatwiałem coś takiego właśnie wskaźnikiem do metody - delegate a dokładniej Action. Wiec wygląda na to ze wystarczy mi "Dowolnym callbackiem zwracającym void i nie przyjmującym argumentów". Ale przyznam, że o ile zrozumiałem w czym problem, to nadal nie wiem jak to poprawnie zaimplementować ;). Dzięki za linka właśnie się w niego wczytuje.

0

Zatem w konstruktorze przyjmuj std::function<void()>, a wołaj go z [this] { d(); }. Jest oczywiście kilka innych sposobów, ale osobiście uważam wlaśnie taki za najczytelniejszy.

0

ten design jest jakiś słaby skoro wymaga takich środków, na bank nie tędy droga

0

Nie znam SFML, ale jakbym ja miał projektować klase Button, to pewnie zrobiłbym coś takiego:

class Button {
public:
    void addOnClickCallback(std::function<void()> callback) { onClickCallback.connect(callback); }

private:
    boost::signals2::signal<void()> onClickCallback;
};
3

tam już są eventy pewnie jak w każdym frameworku do ui https://www.sfml-dev.org/tutorials/2.0/window-events.php dlatego myślę, że pytający nie wie jak z nich korzystać i tworzy własny system do zarządzania tym co już jest

1 użytkowników online, w tym zalogowanych: 0, gości: 1