ďťż

Ładny brzuch

Napisałem taką klasę ( pomoc szkolna :D ):
#include <ostream> class potega { private: int podstawa; /* potęgi */ int wykladnik; /* potęgi */ public: potega() /* konstruktor domyślny */ { podstawa = wykladnik = 0; } potega( int a, int b ) : podstawa(a), wykladnik(b ) {} /* drugi konstruktor */ ~potega() {} /* destruktor */ /* przeładowane operatory = łatwiejsze korzystanie z klasy */ int operator!(); /* potęguje liczbę */ potega operator()(potega potega1, int wykladnik2); potega operator()(int podstawa1, int podstawa2, int wykladnik); /* mnożenie i dzielenie [ z zastosowaniem własności potęg] */ potega operator*(potega druga); potega operator/(potega druga); /* dodaje i odejmuje potęgi */ int operator+(potega druga); int operator-(potega druga); friend ostream& operator<<(ostream& strum, const potega & x) { strum << x.podstawa << "^" << x.wykladnik; return strum; } }; void PotegaParser();

Program kompiluje się dobrze jeśli łączę pliki osobno. Ale jak używam pliku Makefile
potega: main.cc potega.o g++ main.cc potega.o -o potega potega.o: potega.h potega.cpp g++ potega.h potega.cpp -c

To kompilator zwraca taki błąd:
jedrzej@jedrzej-desktop:~/cpp$ make g++ potega.h potega.cpp -c potega.h:49: error: ISO C++ forbids declaration of ‘ostream’ with no type potega.h:49: error: ‘ostream’ is neither function nor member function; cannot be declared friend potega.h:49: error: expected ‘;’ before ‘&’ token potega.h:55: error: expected `;' before ‘}’ token make: *** [potega.o] Błąd 1
:blink:
Moż mi ktoś wytłumaczyc dlaczego tak się dzieje???



moze zle podzieliles te pliki

pokaz co masz w kazdym pliku..

Nieprawidłowo przeładowałeś operator i użyłeś słowa kluczowego friend. W środku klasy operator << przyjmuje jeden argument (w tym wypadku strumień), bo drugim jest obiekt na rzecz, którego wywołujesz ten operator. Aby stworzyć zaprzyjaźniony operator, musisz wyrzucić jego definicję poza klasę, a w środku zostawić jedynie deklarację. Słowa friend nie możesz postawić przed definicją metody, bo nie ma to sensu. Skoro umieszczasz funkcję w środku klasy, to automatycznie ma ona dostęp do jej własności prywatnych ;)

class potega { friend ostream& operator << (ostream& strum, const potega& x); }; ostream& operator << (ostream& strum, const potega& x) { return (strum << x.podstawa << "^" << x.wykladnik); }
Użytkownik Kozack edytował ten post 20 październik 2008, 12:25
  • zanotowane.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • zsf.htw.pl
  •