Przeciążenie operatora + klasy

0

Witam, aktualnie uczę się c++, mam problem z przeciążeniem operatora dodawania.
Oto kod klasy:

class Wektor {
private:
    int dlugosc;
    int* tablica;
public:
    Wektor();
    Wektor(int a,int b);
    Wektor(Wektor&);
    int jaka_dlugosc ();
    void wypisz_tablice ();
    ~Wektor() {delete []tablica;}
    friend bool operator==(Wektor& w1, Wektor& w2);
    friend bool operator!=(Wektor& w1, Tablica_liczb& tablica) ;
    Wektor operator+(Wektor& w1);
};

A oto kod funkcji przeciążającej operator:

Wektor Wektor::operator+(Wektor& w1) {
    Wektor w3(w1.dlugosc,0);
    for (int i=0;i<w3.dlugosc;i++) {
        w3.tablica[i]=w1.tablica[i]+this->tablica[i];
    }
    return w3;
}

Wypisując najpierw obiekt1 później obiekt2, a następnie obiekt3 czyli obiekt1+obiekt2 dostaję wynik:
6 6 6 6 6 6
6 6 6 6 6 6
12410024 12390264 12 12 12 12

Dodam, że jeżeli dodam linijkę kodu w funkcji przeciążającej operator+ :

Wektor Wektor::operator+(Wektor& w1) {
    Wektor w3(w1.dlugosc,0);
    for (int i=0;i<w3.dlugosc;i++) {
        w3.tablica[i]=w1.tablica[i]+this->tablica[i];
        cout << w3.tablica[i] << "  " ;  // DODANA LINIJKA KODU
    }
    return w3;
}

To w tym miejscu następuje wypisanie wartości 12 12 12 12 12 12 czyli poprawnych, zatem błąd występuje przy zwracaniu ?

0

Nie wygląda na to abyś przestrzegał regułę 3/5/0. Pokaż Wektor(Wektor&)

0

Reguła 3 5 0 ?

Wektor::Wektor(Wektor& w) {
    this->dlugosc = w.dlugosc ;
    this->tablica = new int[dlugosc];
    for (int i=0;i<dlugosc;i++) {
        tablica[i] = w.tablica[i];
    }
}
0

Niestety nadal nie wiem, co należy zmodyfikować, aby unikać tych dwóch błędnych wyników.

0

Jeszcze do kompletu, można dać void wypisz_tablice ();

0

Utwórz konstruktor kopiujący i go zdefiniuj. Konstruktor kopiujący przyjmuje const referencję na typ.

0
Wektor::Wektor(const Wektor& w) {
    this->dlugosc = w.dlugosc ;
    this->tablica = new int[dlugosc];
    for (int i=0;i<dlugosc;i++) {
        tablica[i] = w.tablica[i];
    }
}

Konstruktor kopiujący, aczkolwiek sytuacji to nie zmieniło.
Oraz proszę metoda wypisz:

void Wektor::wypisz_tablice() {
    for (int i=0;i<dlugosc;i++) {
        cout << tablica[i] << "  ";
    }
    cout << endl << endl;
}
0

Pokaż cały kod teraz.

0
#include <iostream>

using namespace std;

class Tablica_liczb {
    public:
    int* tablica;
    int dlugosc;
    Tablica_liczb(int dlugosc, int liczba);
};

class Wektor {
private:
    int dlugosc;
    int* tablica;
public:
    Wektor();
    Wektor(int a,int b);
    Wektor(const Wektor&);
    int jaka_dlugosc ();
    void wypisz_tablice ();
    ~Wektor() {delete []tablica;}
    friend bool operator==(Wektor& w1, Wektor& w2);
    friend bool operator!=(Wektor& w1, Tablica_liczb& tablica) ;
    Wektor operator+(Wektor& w1);
};

Wektor::Wektor() {
    this->dlugosc = 5;
    tablica = new int[dlugosc];
    for (int i=0;i<dlugosc;i++) {
        tablica[i] = 0;
    }
}

Wektor::Wektor(int a, int b) {
    this->dlugosc = a;
    tablica = new int[dlugosc];
    for (int i=0;i<dlugosc;i++) {
        tablica[i] = b;
    }
}

Wektor::Wektor(const Wektor& w) {
    this->dlugosc = w.dlugosc ;
    this->tablica = new int[dlugosc];
    for (int i=0;i<dlugosc;i++) {
        tablica[i] = w.tablica[i];
    }
}

bool operator==(Wektor& w1, Wektor& w2) {
    int licznik =0;
    if (w1.dlugosc==w2.dlugosc){
        for (int i=0;i<w1.dlugosc;i++) {
            if (w1.tablica[i]==w2.tablica[i]) licznik++;
        }
    }
    if (licznik==w1.dlugosc) return true;
    else return false;
}

bool operator!=(Wektor& w1, Tablica_liczb& tablica) {
    int licznik=0;
    if (w1.dlugosc==tablica.dlugosc){
        for (int i=0;i<w1.dlugosc;i++) {
            if (w1.tablica[i]==tablica.tablica[i]) licznik++;
        }
    }
    if (licznik==w1.dlugosc) return true;
    else return false;
}

Wektor Wektor::operator+(Wektor& w1) {
    Wektor w3(w1.dlugosc,0);
    for (int i=0;i<w3.dlugosc;i++) {
        w3.tablica[i]=w1.tablica[i]+this->tablica[i];
    }
    return w3;
}

int Wektor::jaka_dlugosc(){
    return this->dlugosc;
}

void Wektor::wypisz_tablice() {
    for (int i=0;i<dlugosc;i++) {
        cout << tablica[i] << "  ";
    }
    cout << endl << endl;
}

Tablica_liczb::Tablica_liczb(int dlugosc, int liczba){
    this->dlugosc = dlugosc;
    tablica = new int[dlugosc];
    for (int i=0;i<dlugosc;i++) {
        tablica[i] = liczba;
    }
}

int main()
{
    Tablica_liczb tab1(5,0);
    bool czy_rowne;
    bool czy_rowne2;
    Wektor w1;
    Wektor w2(6,6);
    Wektor w3=w2;
    Wektor w4;
    w4=w2+w3;
    czy_rowne=w3==w2;
    czy_rowne2=w1!=tab1;

    w1.wypisz_tablice();
    w2.wypisz_tablice();
    w3.wypisz_tablice();
    w4.wypisz_tablice();
    cout << czy_rowne << endl;
    cout << czy_rowne2 << endl;
    return 0;
}

0

Jednak miałem rację, chociaż wstyd że dopiero teraz załapałem. Teraz konstruktor jest ok, ale nie masz operatora =, który wg. reguły 3/5/0 powinien tam być. Dopisz go.

0
Wektor& Wektor::operator=(const Wektor& w1) {
    this->dlugosc = w1.dlugosc;
    if (tablica!=NULL) {
        delete[] tablica;
    }
    this->tablica = new int[dlugosc];
    for (int i=0;i<dlugosc;i++) {
        this->tablica[i] = w1.tablica[i];
    }
    return *this;
}

Problem rozwiązany, kq dziękuje bardzo za pomoc. Teraz wszystko gra, kod wstawiam jeśliby ktoś kiedyś potrzebował.

1 użytkowników online, w tym zalogowanych: 0, gości: 1