Operatory

0

Cześć
Ostatnio próbowałem ogarnąć operatory , poczytałem trochę na necie, popisałem i natrafiłem na problem (pewnie dość prosty) którego nie umiem rozwiązać
Przy próbie utworzenia obiektu za pomocą dodania dwóch innych pojawia się bład : invalid operands to binary expression ('Complex' and 'Complex')
Jakby ktoś wytłumaczył dlaczego to nie zadziała a nie wysyłał materiały albo dokumentacje byłbym wdzięczny

#include <iostream>
using namespace std;

class Complex {
    
friend Complex operator + (Complex const &);
    
private:
    int real, imag;
public:
    Complex(int,int);

    
    void print() { cout << real << " + i" << imag << endl; }
};

Complex::Complex(int r , int i )
{
    real = r ;
    imag = i ; 
}

Complex operator + (Complex const &obj)
{
    Complex tmp(0,0);
    tmp.real=tmp.real + obj.real;
    tmp.imag=tmp.imag + obj.imag;
    return tmp;
}

int main()
{
    Complex c1(10, 5), c2(2, 4) , c4(1,1);
    Complex c3 = c1 + c2  ;//+ c4;
    //c3.print();
}
1

Definiujesz tu funkcję wolą, a nie funkcję klasy:

Complex operator + (Complex const &obj)
{
    Complex tmp(0,0);
    tmp.real=tmp.real + obj.real;
    tmp.imag=tmp.imag + obj.imag;
    return tmp;
}

Zamiast narzekać na materiały przeczytaj je: https://dsp.krzaq.cc/post/304/jak-przeladowywac-operatory-w-mojej-klasie/

2

Masz jednoargumentową funkcję Complex operator + (Complex const &);, co się dziwić? Dodawanie zazwyczaj wymaga dwóch argumentów.

0

Hej jeszcze wracajac do ostatniego dlaczego w tej implementacji to nie działa
w main nie chce przejść macierz macierz3 = macierz1+macierz2;
error: no matching constructor

class macierz
{
    friend macierz operator + (macierz const & , macierz const &);

public :
    macierz(int** , int , int );
private:
    int **macierzMain;
    int wiersze , kolumny  ;
};

macierz operator + (macierz const &obj , macierz const &obj2)
{
//cokolwiek
        macierz nowaMacierz(tmpTab,obj.wiersze,obj.kolumny);
        return nowaMacierz;
        }
}

int main()
{
    macierz macierz1(5,5);
    macierz macierz2(5,5);
    macierz macierz3 = macierz1 + macierz2 ;
}
0

Wrzuć MCVE, bo to nie ma prawa się skompilować.

1
    macierz macierz1(5,5);

to chyba wymaga konstruktora postaci macierz(int, int)?

0

potrzebna całość
błąd że nie wrzuciłem od razu

#include <iostream>
using namespace std;

class macierz
{
    friend macierz operator + (macierz const & , macierz const &);

public :
    macierz(int,int);
    macierz(int** tab , int m , int n )
    {
    
        for(int i = 0; i <wiersze; ++i) {
            delete[] macierzMain[i];
        }
        delete[] macierzMain;
        
        for ( int i = 0 ; i<m ; i++)
        {
            for ( int j = 0 ;  j<n ; j++)
            {
                macierzMain[i][j]=tab[i][j];
            }
        }
        wiersze = m ;
        kolumny = n ;
    }
private:
    int **macierzMain;
    int wiersze , kolumny  ;
};

macierz::macierz(int m , int n)
{
    for(int i = 0; i <wiersze; ++i) {
        delete[] macierzMain[i];
    }
    delete[] macierzMain;
    
    for ( int j = 0 ;j < m ; j++)
    {
        for ( int k = 0 ; k < n ; k++)
        {
            macierzMain[j][k]=0;
        }
    }
    wiersze = m ;
    kolumny = n ;
}

macierz operator + (macierz const &obj , macierz const &obj2)
{
        //cokolwiek
        macierz nowaMacierz(tmpTab,obj.wiersze,obj.kolumny);
        return nowaMacierz;

}
int main()
{

    macierz macierz1(5,5);
    macierz macierz2(5,5);
    macierz macierz3 = macierz1 + macierz2 ;
} 

0

Znów coś nie do końca:

rr.cc: In function ‘macierz operator+(const macierz&, const macierz&)’:
rr.cc:54:29: error: ‘tmpTab’ was not declared in this scope; did you mean ‘tmpnam’?
   54 |         macierz nowaMacierz(tmpTab,obj.wiersze,obj.kolumny);
      |                             ^~~~~~
      |                             tmpnam

Jak tam wstawię NULL zamiast tmpTab to się kompiluje bez problemu.

0

Edit : Okej jest to spowodowanie konstruktorem kopiującym

mogę napisać to w taki sposób aby się ze sobą nie gryzły ?

konstruktor kopiujący :

macierz::macierz(macierz &obiekt)
{
            double **tmpTab;
            tmpTab= new double*[obj.wiersze];
            for ( int i = 0 ; i < obj.wiersze; i++)
            {
                tmpTab[i]=new double[obj.kolumny];
            }

    wiersze=obiekt.wiersze;
    kolumny=obiekt.kolumny;

    for ( int j = 0 ;j < wiersze ; j++)
    {
        for ( int k = 0 ; k < kolumny ; k++)
        {
            macierzMain[j][k]=obiekt.macierzMain[j][k];
        }
    }
}
1
Chili pepper napisał(a):

Edit : Okej jest to spowodowanie konstruktorem kopiującym

Nie; błąd jest spowodowany tym że masz nagle jakieś tmpTab które jest nie wiadomo czym.

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