Witam!
Przeciążam operator + i = w taki sposób:
Tablice Tablice::operator+(const Tablice &t) {
Tablice temp;
delete temp.tab;
//przekopiuj wszystko do temp (nie wrzucam tego, zeby bylo czytelniej)
return temp;
}
void Tablice::operator=(const Tablice& t) {
delete tab;
tab = new int[t.cellsTaken];
cellsTaken = t.cellsTaken;
sizeOfArr = t.sizeOfArr;
for (int i = 0; i < cellsTaken; i++) {
tab[i] = t.tab[i];
}
}
Wszystko działa, ale chcę uniknąć używania konstruktora kopiującego podczas używania operatora +. No to zmieniam:
Tablice& Tablice::operator+(const Tablice &t) {
Tablice temp;
delete temp.tab;
//przekopiuj wszystko do temp (nie wrzucam tego, zeby bylo czytelniej)
return temp;
}
Nie działa, debugger wyrzuca błąd w operatorze = w linii:
tab = new int[t.cellsTaken];
Zauważyłem, że działa gdy w operatorze + returna zmieni się na:
return *this;
Nie wiem czemu teraz nie rzuca błędem, ale zwracam nie to, co chciałem to zmieniam operator + tym razem na:
Tablice& Tablice::operator+(const Tablice &t) {
Tablice temp;
delete temp.tab;
//przekopiuj wszystko do temp (nie wrzucam tego, zeby bylo czytelniej)
Tablice* ptr = &temp;
return *ptr;
}
Ale nie działa, co mnie nieszczególnie dziwi, ale nie wiem czemu w przypadku *this
nie ma żadnych problemów.
Ostatecznie postanowiłem zwracać przez wskaźniki w taki sposób:
Tablice* Tablice::operator+(const Tablice &t) {
Tablice temp;
delete temp.tab;
//przekopiuj wszystko do temp (nie wrzucam tego, zeby bylo czytelniej)
Tablice* ptr = &temp;
return ptr;
}
void Tablice::operator=(const Tablice* t) {
delete tab;
tab = new int[t->cellsTaken];
cellsTaken = t->cellsTaken;
sizeOfArr = t->sizeOfArr;
for (int i = 0; i < cellsTaken; i++) {
tab[i] = t->tab[i];
}
}
Ale teraz też nie działa i debugger wywala się w tej samej linijce, co wcześniej.
Nie jestem pewien, ale w tym przypadku może to być powodowane, że operator = dostaje kopię wskaźnika zwracanego z operatora + (jeżeli mówię głupoty to będę wdzięczny za sprostowanie), to spróbowałem ostatniej opcji, która mi przyszła do głowy:
void Tablice::operator=(const Tablice*&t) {
Ale teraz, to się nawet nie kompiluje i linker wywala się w main'ie:
int main()
{
Tablice tab;
Tablice t;
tab.addLast(1);
t.addLast(2);
Tablice sum;
sum = t + tab; // w tym miejscu
cout << sum;
return 0;
}
Jak ktoś jest w stanie powiedzieć mi jak poprawnie się powinno zmienić operator +, aby nie używał konstruktora kopiującego lub
wytłumaczył czemu moje metody nie działają (gdzie najbardziej mnie ciekawi, czemu *this działa) będę bardzo wdzięczny.
EDIT:
Spróbowałem zmienić jeszcze w inny sposób, ale nie do końca działa. Printuje odpowiednią ilośc danych, ale zupełnie śmieciowe wartości, a po wyprintowaniu wyskakuje całą masa crash'y. Debugger nie wyrzuca mnie do żadnego miejsca w kodzie (w sumie po wyprintowaniu, juz nic nie ma), ale wyrzuca coś takiego : "wntll.pdb not loaded", a to już zupełnie nie wiem, co oznacza:
Tablice& Tablice::operator+(const Tablice &t) {
Tablice temp;
delete temp.tab;
temp.sizeOfArr = sizeOfArr + t.sizeOfArr;
temp.cellsTaken = cellsTaken + t.cellsTaken;
temp.tab = new int[temp.sizeOfArr];
for (int i = 0; i < cellsTaken; i++) {
temp.tab[i] = tab[i];
}
int j = 0;
for (int i = cellsTaken; j < t.cellsTaken; i++) {
temp.tab[i] = t.tab[j];
j++;
}
return temp;
}
void Tablice::operator=(const Tablice*&t) {
delete tab;
tab = new int[(t)->cellsTaken];
cellsTaken = (t)->cellsTaken;
sizeOfArr = (t)->sizeOfArr;
for (int i = 0; i < cellsTaken; i++) {
tab[i] = (t)->tab[i];
}
}