Przekazywanie funkcji do konstruktora

Odpowiedz Nowy wątek
2012-01-03 22:36

Rejestracja: 9 lat temu

Ostatnio: 6 lat temu

0

Mam taki problem - Jest sobie klasa, która w konstruktorze przyjmuje sobie wskaźnik do funkcji z zewnątrz (z poza klasy). Klasa ta posiada też metodę, która ma wywołać przekazaną funkcję w tym konstruktorze. Chodzi o to, że tworzę nowy obiekt klasy, podając mu adres funkcji, po czym wywołuję sobie metodę z tej klasy, która ma wywołać tą funkcję :).
Np.

class Klasa 
{
    public:
        int numer;
        Klasa(void(*f)(const Klasa& k)); //nie jestem w 100% pewny czy dobrze przekazuje adres funkcji
        wywolaj()
        {
            //tu ma wywolac przekazana do konstruktora funkcje
        }
}

void funkcja(const Klasa& k)
{
    cout<<"numer: "<<k.numer<<<<endl;
}
int main()
{
    Klasa mojaKlasa(funkcja);
    mojaKlasa.wywolaj(); //w tym miejscu wywoluje
}

Moje pytanie - w jaki sposób coś takiego osiągnąć (wywołać tą funkcję przez metodę)?


Idiots, idiots everywhere.
edytowany 1x, ostatnio: allocer, 2012-01-03 22:36

Pozostało 580 znaków

2012-01-03 22:54

Rejestracja: 17 lat temu

Ostatnio: 1 miesiąc temu

Lokalizacja: Katowice

1

Skoro już masz wskaźnik na funkcję to go wywołaj. :-)

#include <iostream>

using namespace std;

class Klasa;
typedef void (*KlasaFun)(const Klasa &k);

class Klasa  {
public:
  Klasa(KlasaFun f, int n) :
    numer(n),
    mFun(f) {
  }

  void wywolaj() {
   mFun(*this);
  }

  int numer;

private:
  KlasaFun mFun;
};

void funkcja(const Klasa& k) {
  cout << "numer: " << k.numer << endl;
}

int main() {
  Klasa mojaKlasa(funkcja, 123);
  mojaKlasa.wywolaj();
}

http://ideone.com/BT1Wc


"(...) otherwise, the behavior is undefined".
Dzięki, o coś takiego mi chodziło. Tylko jedna kwestia - numer się sam inkrementuje, nie jest podawany przy tworzeniu obiektu. Co wtedy? - allocer 2012-01-03 22:59
Nie rozumiem, jakie to ma znaczenie dla wywołania funkcji? Mógłbyś wyjaśnić (w poście) co masz na myśli? :-> - Endrju 2012-01-03 23:01

Pozostało 580 znaków

2012-01-03 23:03

Rejestracja: 9 lat temu

Ostatnio: 6 lat temu

0

Chodzi o to, że tworzę sobie X takich obiektów. Wywołuję tylko konstruktor z jednym parametrem, natomiast zmienna numer jest liczbą utworzonych dotąd obiektów tej klasy.


Idiots, idiots everywhere.

Pozostało 580 znaków

2012-01-03 23:11

Rejestracja: 14 lat temu

Ostatnio: 3 dni temu

Lokalizacja: Warszawa

0

Bracie allocer,a weź ty poczytaj cóże to takiego się stanie jak zdeklarujesz jakieś pole klasy jako static :]


"Sugeruję wyobrazić sobie Słońce widziane z orbity Merkurego, a następnie dupę tej wielkości. W takiej właśnie dupie specjalista ma teksty o wspaniałej atmosferze, pracy pełnej wyzwań i tworzeniu innowacyjnych rozwiązań. Pracuje się po to, żeby zarabiać, a z resztą specjalista sobie poradzi we własnym zakresie, nawet jeśli firma mieści się w okopie na granicy obu Korei."
-somekind,
konkretny człowiek-konkretny przekaz :]

Pozostało 580 znaków

2012-01-03 23:17

Rejestracja: 17 lat temu

Ostatnio: 1 miesiąc temu

Lokalizacja: Katowice

Czyli zmienna numer powinna być statyczną składową Twojej klasy. Nie ma żadnych niezwykłości w jej odczytaniu:

#include <iostream>

using namespace std;

class Klasa  {
public:
  Klasa() {
    numer++;
  }

  ~Klasa() {
    numer--;
  }

  static int numer;
};

int Klasa::numer = 0;

int main() {
  Klasa mojaKlasa1, mojaKlasa2, mojaKlasa3, mojaKlasa4;
  cout << Klasa::numer << endl;
}

http://ideone.com/BOJo0

Trzeba by jeszcze dorobić śledzenie konstruktora kopiującego czy użycie operatorów new i delete, lub w ogóle użyć Curiously recurring template pattern. Całkiem sporo można poczytać w Internecie o tym.


"(...) otherwise, the behavior is undefined".
edytowany 3x, ostatnio: Endrju, 2012-01-03 23:21

Pozostało 580 znaków

2012-01-03 23:21

Rejestracja: 9 lat temu

Ostatnio: 6 lat temu

0
MasterBLB napisał(a)

Bracie allocer,a weź ty poczytaj cóże to takiego się stanie jak zdeklarujesz jakieś pole klasy jako static :]

No właśnie tego słowa mi brakowało. Zamulony dzisiaj jakiś jestem ;).


Idiots, idiots everywhere.

Pozostało 580 znaków

Odpowiedz

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