Przekazywanie funkcji do konstruktora

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ę)?

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

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.

0

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

0

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.

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 ;).

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