C++ szablon klasy

muller
Użytkownik
Użytkownik
Posty: 206
Rejestracja: 8 gru 2006, o 19:28
Płeć: Mężczyzna
Lokalizacja: Centrum
Podziękował: 85 razy
Pomógł: 6 razy

C++ szablon klasy

Post autor: muller »

Bez STL napisz szablon klasy Array zarządzającej tablicą elementów T o zmiennym dynamicznie rozmiarze. Zaimplementuj metody: 1. konstruktor 2. destruktor 3. bool add(const T&) 4. konstruktor kopiujący 5. operator przypisania.

Mój kod, w którym kompilator nie uznaje operatora przypisania (mam jakiś błąd). jestem początkującym programistą, dlatego z pewnością to zadania można by rozwiązać lepiej. Proszę o wszelkie propozycje zmian i wytknięcie błędów, poprawę kodu. Z pewnością się czegoś nauczę

Kod: Zaznacz cały

#include <iostream>
#include <string>

using namespace std;

template <class T>
class Array
{
      private:
         T * tablica;
         int ile; //ilość elementów w tablicy
         int i;   // indeks tablicy
      public:
         Array();
         ~Array();
         bool add(const T &);
         Array(const Array & wz); // konstruktor kopiujacy
         Array & operator=(const Array &);
         void Array<T>::wypisz();
};

template <class T>
  Array<T>::Array()
  {
    ile=  0; //ilość elementów
    i= -1;   // indeks tablicy
  }
template <class T>
  Array<T>::~Array()
  {
    delete [] tablica;
  }
 
template <class T>
  bool Array<T>::add(const T & elem)
  {
     i++;
     T tmp[i];

     for(int a=0; a< i; a++)
     {
       tmp[a]= tablica[a];
     }

     if(ile!=0)
     delete [] tablica;

     i++;
     if((tablica = new T [i]))
     {
     for(int b=0; b<i; b++)
     {
        tablica[b] = tmp[b];
     }
     tablica[ile]=elem;
     ile++;
     
     return true;
     }
     else
     return false;
}

template <class T>
   Array<T>::Array(const Array & wz)
   {
   
     tablica = new T [wz.ile];
     for(int a=0; a<wz.ile; a++)
     {
        tablica[a]=wz.tablica[a];
     }
     i= wz.i;
     ile= wz.ile;
   }
   
template <class T>
  void Array<T>::wypisz()
  {
    for(int i=0; i < ile; i++)
    {
      cout << tablica[i] << endl;
    }
  }
   
/*template <class T>
   Array & Array<T>::operator=(const Array & wz)
   {
     i=wz.i;
     ile=wz.ile;
     for(i=0; i<wz.ile; ile++)
     {
       tablica[i]=wz.tablica[i];
     }
     return *this;
   }*/[quote][/quote]
Awatar użytkownika
N4RQ5
Użytkownik
Użytkownik
Posty: 421
Rejestracja: 15 lis 2006, o 16:22
Płeć: Mężczyzna
Lokalizacja: Suwałki/Wawa
Pomógł: 104 razy

C++ szablon klasy

Post autor: N4RQ5 »

Co do operatora przypisania to w pętli zmień sobie ile++ na i++ to może pomoże.
Poza tym czemu służy składowa i? Nie wczytywałem się dokładnie ale to chyba ma być jakaś zmienna lokalna wspomagająca iteracje przy operacjach na tablicy. Dlaczego więc zadeklarowałeś ją jako składową? Może niech pozostanie zwyczajną zmienną lokalną każdej funkcji. Nie trzeba jej wplątywać w strukturę klasy, chyba że przegapiłem jakąś jej ważną funkcję.
soku11
Użytkownik
Użytkownik
Posty: 6607
Rejestracja: 16 sty 2007, o 19:42
Płeć: Mężczyzna
Podziękował: 119 razy
Pomógł: 1823 razy

C++ szablon klasy

Post autor: soku11 »

Poprawny kod:

Kod: Zaznacz cały

#include <iostream>
using namespace std;

template <class T>
class Array
{
  private:
    T * tablica;
    int ile; //ilość elementów w tablicy
  public:
    Array();
    Array(const Array<T> & wz); // konstruktor kopiujacy
    ~Array();

    Array<T>& operator=(const Array<T> &);
    T& operator[](unsigned int index);

    void add(const T &);
    void wypisz();
};

template <class T>
Array<T>::Array()
{
  ile=0; //ilość elementów
  tablica=NULL;
}

template <class T>
Array<T>::~Array()
{
  if(tablica)
    delete [] tablica;
}

template <class T>
void Array<T>::add(const T& elem)
{
  T* tmp; // allokujemy dynamicznie, nie mozna statycznie!
  tmp=new T[++ile];

  if(tablica)
  {
    for(int a=0; a<ile-1; ++a)
      tmp[a]= tablica[a];
  }

  tmp[ile-1]=elem;

  if(tablica)
    delete tablica;

  tablica=tmp;
}

template <class T>
Array<T>::Array(const Array & wz)
{
  tablica = new T [wz.ile];
  for(int a=0; a<wz.ile; a++)
    tablica[a]=wz.tablica[a];
  ile= wz.ile;
}

template <class T>
void Array<T>::wypisz()
{
  for(int i=0; i < ile; i++)
    cout << tablica[i] << endl;
}

template <class T>
Array<T>& Array<T>::operator=(const Array & wz)
{
  ile=wz.ile;

  for(int i=0; i<wz.ile; ++i)
    tablica[i]=wz.tablica[i];
  return *this;
}

template <class T>
T& Array<T>::operator[](unsigned int index)
{
  return tablica[index];
}

int main()
{
  Array<int> tab1;
  Array<int> tab2;

  for( int i=0;i<10;++i)
    tab1.add(i);

  for( int i=-10;i<0;++i)
    tab2.add(i);

  cout<<"tab1:"<<endl;
  tab1.wypisz();
  cout<<"tab2:"<<endl;
  tab2.wypisz();

  tab1=tab2;
  cout<<"tab1:"<<endl;
  tab1.wypisz();
  return 0;
}

Troche pozmienialem, zeby nie bylo bledow i mysle ze bedzie dzialac troszkim szybciej POZDRO
ODPOWIEDZ