Uczę się C++, wydawało mi się że dość dobrze rozumiem jak dotąd, ale chyba jednak nie...
Doszedłem do szablonów i tu natknąłem się na zadanie, którego nie potrafię rozwiązać sensownie, a właściwie to w ogóle.
Mamy klasę szablonową K, w niej liczbę całkowitą - rozmiar tablicy oraz samą tablicę (dynamiczną) o typie zdefiniowanym przez użytkownika. W klasie mam przeciążyć operator odejmowania i napisać metodę wypisującą zawartość tablicy. Dla sprawdzenia mam stworzyć 3 obiekty typu float b1,b2,b3 i zrobić b3=b1-b2, po czym wypisać b3. Przy czym przy odejmowaniu jeśli tablice są różnych rozmiarów to wynikowy obiekt ma mieć tablicę o rozmiarze tej mniejszej z wejściowych tablic. Czyli np. b1 ma 5 elementów tablicę, b2 ma 3 elementy i zrobimy b3=b1-b2 to b3 ma tablicę 3 elementową i w niej odjęte od siebie tylko te 3 wyrazy które można odjąć ( w tym przypadku 2 ostatnie wyrazy z b1 będą pominięte).
Mój kod jak dotąd wygląda tak:
#include <iostream>
using namespace std;
template<typename Typ>
class K
{
private:
int n; //wielkosc tablicy
Typ *T; //tablica
public:
K()
{
//pusty konstruktor
}
K(int roz); //konstruktor
~K(); //destruktor
//operator odejmowania, z tym jest problem :/
K operator- (K<Typ> obj)
{
int mniejszy;
if(n < obj.n)
{
mniejszy=n;
}
else //szukam ktora z wejsciowych tablic jest mniejsza
{
mniejszy=obj.n;
}
for(int i=0;i<mniejszy;i++)
{
T[i]-=obj.T[i]; //odejmuje
}
return *this; //zwracam
}
void wynik(); //metoda wyswietlajaca obiekt
};
template<typename Typ>
K<Typ>::K(int roz)
{
n=roz;
T=new Typ[n];
for(int i=0;i<n;i++)
{
cout<<"Podaj "<<i+1<<" wyraz: "; //konstruktor, wczytujacy dane
cin>>T[i];
}
}
template<typename Typ>
K<Typ>::~K()
{
delete [] T; //destruktor zwalnia pamiec
}
template<typename Typ>
void K<Typ>::wynik()
{
for(int i=0;i<n;i++)
{
cout<<i+1<<" wyraz: "<<T[i]<<endl; //metoda wypisujaca
}
}
int main()
{
K<float> b1(5), b2(3); //tworze obiekty
K<float> b3;
b3=b1-b2; //odejmowanie
b3.wynik(); //wypisanie
system("PAUSE");
return 0;
}
Tak, wiem że do obiektu b3 chcę wpisać dane jak nie mam na nie zaalokowanej pamięci. Niezbyt wiem jak zorganizować te konstruktory żeby to wszystko miało sens.
Piszę pod VisualC++ 2005, ale wiem że g++ zachowuje się akurat w tym przypadku znacznie inaczej. Tzn. kod działa inaczej. Próbowałem już to robić na 10 sposobów i dalej nie doszedłem do właściwego. Próbowałem tworzyć w operatorze obiekt pomocniczy i go zwracać, ale też był problem z alokacją.
Jak ustawię pracę krokową i śledzę operator odejmujący, to wydaje mi się że tablice w pętli odejmującej mają inne wartości niż powinny.
Z góry dzięki za wszelką pomoc.