ďťż

Ładny brzuch

Ucząc się szblonów napotkałem na problem, ponieważ poniższy listing z książki C++ Dla Każdego nie kompiluje mi się (kompilator Dev-C++ 4.9.9.2. Dlaczego?
#include <iostream> using namespace std; const int DefaultSize = 10; class Animal { public: Animal(int); Animal(); ~Animal() {} int GetWeight() const { return itsWeight; } void Display() const { cout << itsWeight; } private: int itsWeight; }; Animal::Animal(int weight): itsWeight(weight) {} Animal::Animal(): itsWeight(0) {} template <class T> // deklaruje wzorzec i parametr class Array // parametryzowana klasa { public: // konstruktory Array(int itsSize = DefaultSize); Array(const Array &rhs); ~Array() { delete [] pType; } // operatory Array& operator=(const Array&); T& operator[](int offSet) { return pType[offSet]; } const T& operator[](int offSet) const { return pType[offSet]; } // akcesory int GetSize() const { return itsSize; } friend ostream& operator<< (ostream&, Array<T>&); private: T *pType; int itsSize; }; template <class T> ostream& operator<< (ostream& output, Array<T>& theArray) { for (int i = 0; i<theArray.GetSize(); i++) output << "[" << i << "] " << theArray[i] << endl; return output; } // oraz implementacje... // implementacja konstruktora template <class T> Array<T>::Array(int size): itsSize(size) { pType = new T[size]; for (int i = 0; i<size; i++) pType[i] = 0; } // konstruktor kopii template <class T> Array<T>::Array(const Array &rhs) { itsSize = rhs.GetSize(); pType = new T[itsSize]; for (int i = 0; i<itsSize; i++) pType[i] = rhs[i]; } // operator= template <class T> Array<T>& Array<T>::operator=(const Array &rhs) { if (this == &rhs) return *this; delete [] pType; itsSize = rhs.GetSize(); pType = new T[itsSize]; for (int i = 0; i<itsSize; i++) pType[i] = rhs[i]; return *this; } int main() { bool Stop = false; // znacznik dla pętli int offset, value; Array<int> theArray; while (!Stop) { cout << "Podaj indeks (0-9) "; cout << "oraz wartosc. (-1 aby skonczyc): " ; cin >> offset >> value; if (offset < 0) break; if (offset > 9) { cout << "***Prosze uzywac wartosci pomiedzy 0 i 9.***\n"; continue; } theArray[offset] = value; } cout << "\nOto cala tablica:\n"; cout << theArray << endl; return 0; }



Przydałaby się treść błędu, bo wróżkami nie jesteśmy ;)


Przydałaby się treść błędu, bo wróżkami nie jesteśmy  ;)


nie kompiluje mi się





Stary a co dokładnie się w nim niekompiluje? Moze byś pokazał jake błędy wawala kompilator a może poprostu źle z ksiąźki przepisałeś. Wiesz nie każdemu chce się szukać literówek w niesfoim, kodzie.

Po pierwsze - napisał.
Po drugie - chyba nie tak trudno skopiować, wkleić i skompilować.
A, już zauważyłeś. ;)
Użytkownik Chmurek edytował ten post 20 marzec 2006, 20:43
Chyba już napisałem wszystko co trzeba, teraz możecie spokojnie odpowiadać na pytanie :) . Na pewno błąd jest związany z funkcja składową(zaprzyjaźnioną) operator <<. Ale nie wiem w czym tkwi błąd.

Po prostu nie zaprzyjaźniaj tego operatora z klasą.


Po prostu nie zaprzyjaźniaj tego operatora z klasą.

Dlaczego najgorsze? Przecież nie musisz zaprzyjaźniać tego operatora z klasą, bo nie potrzebuje on dostępu do jej składowych prywatnych.
Jaką nienaturalną składnię cout? ;)
Po prostu skasuj linijkę
friend ostream& operator<< (ostream&, Array<T>&);
a całą resztę zostaw tak jak jest.
Użytkownik Chmurek edytował ten post 20 marzec 2006, 21:02
Usunąłem tą jedną linijkę i skompilowałem program. Jednak jego dziłanie jest wadliwe, znika po wprowadzeniu danych. A więc coś jest nie tak.
Użytkownik comp123 edytował ten post 20 marzec 2006, 21:12
Co znika?
U mnie działa tak:

> ./a.out
Podaj indeks (0-9) oraz wartosc. (-1 aby skonczyc): 5
7
Podaj indeks (0-9) oraz wartosc. (-1 aby skonczyc): 3
15
Podaj indeks (0-9) oraz wartosc. (-1 aby skonczyc): -1

1

Oto cala tablica:
[0] 0
[1] 0
[2] 0
[3] 15
[4] 0
[5] 7
[6] 0
[7] 0
[8] 0
[9] 0

Po napisaniu -1 i naciśnięciu entera napisz coś jeszcze i naciśnij enter. ;)
Użytkownik Chmurek edytował ten post 20 marzec 2006, 21:18
napisałem tak i po -1 -1 i enter konsola znika.

To uruchom go w konsoli, a nie z Dev-C++ albo dopisz system("pause") czy coś podobnego.
Myślałem, że takie rzeczy to wiesz prawdę mówiąc.
Użytkownik Chmurek edytował ten post 20 marzec 2006, 21:23

To uruchom go w konsoli, a nie z Dev-C++ albo dopisz system("pause") czy coś podobnego.
Myślałem, że takie rzeczy to wiesz prawdę mówiąc.

Jeśli chciałbyś zaprzyjaźnić to przed tamtą linijką dopisz
template <class V>
a w omawianej linijce zmień T na V.


Jeśli chciałbyś zaprzyjaźnić to przed tamtą linijką dopisz
template <class V>
a w omawianej linijce zmień T na V.

  • zanotowane.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • zsf.htw.pl
  •