Przeciążenie operatora =

0

Witam mam zdefiniowaną klasę:
class LiczbaZespolona

 
{
	friend class Macierz_double;
	friend class Wektor_double;
	public:

	  float  re;
	  float  im;
	  LiczbaZespolona operator * (const LiczbaZespolona& Arg2);
	  LiczbaZespolona operator + (const LiczbaZespolona& Arg2);
	  LiczbaZespolona operator = (int i);

};

oraz oraz przeciążenie znaku = dla tej klasy:

 
LiczbaZespolona  LiczbaZespolona::operator = (int i)
		{
	LiczbaZespolona wynik;
		re=i;
		im=i;
		return wynik;
		}

gdy próbuję wykorzystać to przeciążenie:

 TYP Wektor_double::operator *(Wektor_double wektor)
{
	LiczbaZespolona wynik=0;//TUTAJ 

	for(int i=0;i<=3;i++)
	{
		wynik=wynik+(wspolrzedne[i]*wektor.wspolrzedne[i]);
	}
	return wynik;

}

To kompilator wyrzuca mi błąd: conversion from ‘int’ to non-scalar type ‘LiczbaZespolona’ requested
Nie rozumiem dlaczego on probuje konwertowac typ int na typ LiczbaZespolona skoro ma zdefiniowane przeciążenie tego operatora dla tej sytułacji. Pomożecie?

0

Zrobilem tak jak w poście z linku. Czyli

LiczbaZespolona &LiczbaZespolona:: operator = (int  liczba)
{
	re=liczba;
	im=0;
	return *this;
} 
class LiczbaZespolona
{
	friend class Macierz_double;
	friend class Wektor_double;
	public:

	  float  re;
	  float  im;
	  LiczbaZespolona operator * (const LiczbaZespolona& Arg2);
	  LiczbaZespolona operator + (const LiczbaZespolona& Arg2);
	  LiczbaZespolona &operator= (int  liczba);

}; 

i problem nadal jest ten sam.
conversion from ‘int’ to non-scalar type ‘LiczbaZespolona’ requested
Nie wiem skąd bierze się ten błąd.

0

Jeżeli to całość klasy to brakuje ci konstruktora:
LiczbaZespolona(float re=0,float im=0):re(re),im(im) {}

Aby użyć operator = trzeba to zapisać:

LiczbaZespolona wynik;
wynik=0;
0

OK zadziałało bez konstruktora. Zmieniłem tylko tak jak poleciłeś

 LiczbaZespolona wynik=0; 

na

 LiczbaZespolona wynik;
wynik=0;

I teraz moje pytanie dlaczego to ma wpływ na działanie programu. Da się to jakoś w łatwy sposób wyjasnić ? Może jakiś link który pomoże to zrozumieć ??

0
class A
{
public:
    A(float x=0.0f, float y=0.0f): x(x), y(y) { ; }
    A(const A& a): x(a.x), y(a.y) { ; }
    
    A& operator=(const A& a) { x=a.x; y=a.y; return *this; }
    A& operator=(const float z) {x=z; y=0.0f; return *this; }
    
private:
    float x;
    float y;
};
 
int main()
{
    A a;
    A b = 0.0f;
    A c;
    c = b;
    a = 15.0f;
    
    return 0;
}

http://ideone.com/K05rDU
Nie bardzo chce mi rozmyslac co sknociles, ale popatrz wyzej.

I teraz moje pytanie dlaczego to ma wpływ na działanie programu. Da się to jakoś w łatwy sposób wyjasnić ? Może jakiś link który pomoże to zrozumieć ??

Odpowiedz jest jednak prosta. Jesli stosujesz instrukcje typu:

TYP zmienna = costam

kompilator do wykonania tego potrzebuje konstruktora przyjmujacego jako parametr to "costam", a jezeli stosujesz:

TYP zmienna; zmienna = costam 

wtedy wystarczy operator przypisania przyjmujacy to cos tam, a obiekt mozna stworzyc na podstawie konstruktora domyslnego generowanego automatycznie.

0

No to już rozumiem. Dziękuję za pomoc.

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