[ Milan Aksic @ 14.02.2002. 12:29 ] @
Na oznacenim mestima, u implementaciji funkcije clanice PartsList::Iterate(), kao i u deklaraciji funkcije PartsCatalog::ShowAll(), konstantno se prikazuje greska u prevodjenju. Funkcija uzima pokazivac na funkciju clanicu klase Part, koja je const i vraca void:
Code:

class PartsList
{
   public: 
      PartsList();
      ~PartsList();
      // potreban je konstruktor kopije i operator jednako
      void Iterate(void (Part::*f)()const) const;
      Part * Find(ULONG & positon, ULONG PartNumber) const;
      Part * GetFirst() const;
      void Insert(Part *);
      Part * operator[](ULONG) const;
      ULONG GetCount() const { return itsCount; }
      static PartsList & GetGlobalPartsList()
      {
         return GlobalPartsList;
      }
   private:
      PartNode * pHead;
      ULONG itsCount;
      static PartsList GlobalPartsList;
};

// ...

void PartsList::Iterate(void (Part::*f)()const) const
{
   if (!pHead)
      return;
   
   PartNode * pNode = pHead;
   
   do
      (pNode -> itsPart -> *f)(); // ovde javlja gresku !
   while (pNode = pNode -> itsNext);
}

// ...

class PartsCatalog : private PartsList
{
   public:
      void Insert(Part *);
      ULONG Exists(ULONG PartNumber);
      Part * Get(int PartNumber);
      // operator+(const PartsCatalog &);
      void ShowAll() { Iterate(Part::Display); } // i ovde javlja gresku
   private:
      PartsList thePartsList;
};

Gde je greska?
Recite mi, ako bude trebalo da postujem i dodatne implementacije.

Pozdrav.
[ alex @ 14.02.2002. 13:33 ] @
Citat:
passanger:
Funkcija uzima pokazivac na funkciju clanicu klase Part, koja je const i vraca void:
Code:

void PartsList::Iterate(void (Part::*f)()const) const



Ne bih bas rekao da funkcija uzima pokazivac vec uzima ono sto vraca
ta funkcija, odnosno void. Nisam bas siguran, ali mislim da je tako.

Citat:

Gde je greska?
Recite mi, ako bude trebalo da postujem i dodatne implementacije.
Pozdrav.


Postuj kakvu gresku ti prijavljuje kompajler da bi se malo vise upoznali sa problemom.

Poz, alex.
[ Dragi Tata @ 14.02.2002. 16:58 ] @
Na prvi pogled, treba da zameniš

{ Iterate(Part::Display); }

sa

{ Iterate(&Part::Display); }

a za prvu grešku ne vidim uzrok.

Možeš li da postuješ tekst grešaka koje prijavljuje kompajler, kao i deklaraciju klase Part?
[ Milan Aksic @ 14.02.2002. 17:05 ] @
Heh Alex, evo bas sam poceo da ti pisem odgovor, kada sam resio problem.
Naime, ono jeste bio pokazivac na funkciju a ne ono sto vraca pokazivac na funkciju odnosno funkcija, da bi se izbeglo pravljenje pokazivaca na funkciju Part::Display() (koja je druga klasa) u samom programu. Inace pokazivac je tu da se ne bi funkcija clanica Part::Display() pozivala posebno za svaki objekat.

Inace, evo kao je problem resen, ali bi mi mozda sada trebalo malo objasnjenje.
Prva linija gde je greska prijavljivana je:
Code:
(pNode -> itsPart -> *f)();
kompajler je prijavljivao gresku kao parse error before '*' i greska je resena kada je izbacen razmak (blanko) izmedju -> *f
Code:
(pNode -> itsPart [red]->*f[/red])();
Poruka mi je bila jasna ali ne znam koje veze ima to sto je tu bio razmak !? Jer je ista greska bila prijavljivana, i kada su bile ukljucene zagrade zbog prioriteta operatora ?

Drugu gresku sam ja prevideo :) Posto funkcija PartsList::Iterate() ocekuje pointer na funkciju, ja sam prevideo da prosledim adresu funkcije
Code:
 void ShowAll() {Iterate(Part::Display);}
umesto
Code:
 void ShowAll() {Iterate(&(Part::Display));}
.

Samo mi je jos uvek nejasno ovo prvo gore. Koje veze ima razmak ?
[ Dragi Tata @ 14.02.2002. 17:24 ] @
Hrkljuš!!!!

Nisam primetio razmak.

->* je poseban operator, a ne -> za kojim sledi *. Kada ga napišeš odvojeno, to je kao da umesto == staviš = =
[ Milan Aksic @ 14.02.2002. 17:42 ] @
Hrkljush i ja :))
U pravu si. Kako sam samo to mogao da previdim !! Jer je to poseban operator izbor clana za pointer, a kako je ovo funkcija clanica, onda ... HUH !
Thanx cale :)