Przeładowanie operator +

0

Witam, chcę przeładować operator dodawania (+). Mam zrobione klasę punkt.h:

class punkt
{
private:
	double *xy; 
	void rezerwuj();
public:
	punkt(void); 
	punkt(double tmp1, double tmp2);
	~punkt(void);
	void wypisz();
	double pobierzx() { return xy[0]; }
	double pobierzy() { return xy[1]; }
	void ustawxy(double, double);
	punkt& operator+(punkt&);

I cpp tak wygląda dla przeładowania:

punkt& punkt::operator+(punkt& tmp)
{
	punkt wynik;

	wynik.xy[0]=xy[0]+tmp.xy[0];
	wynik.xy[1]=xy[1]+tmp.xy[1];
	return wynik;
}

I w main chce:

punkt p0(2,3), p1(1,1);
	punkt ph;
	ph=p0+p1;
	ph.wypisz();

Zastanawiam się co robie źle, jak to powinienem dobrze przeładować żeby działało?

0

Zwracanie referencji do zmiennej lokalnej:

punkt& punkt::operator+(punkt& tmp)
{
    punkt wynik;
    ...
    return wynik;
}

Identyczny problem: http://4programmers.net/Forum/C_i_C++/241585-przeladowanie_operatorow

0

Czyli w sumie powinno być coś w tym stylu?

punkt operator+(punkt& tmp1, punkt& tmp2)
{
	punkt wynik;
	wynik.xy[0]=tmp1.xy[0]-tmp2.xy[0];
	wynik.xy[1]=tmp1.xy[1]-tmp2.xy[1];
	return wynik;
}
1
punkt operator+(const punkt& left, const punkt& right)
{
    return punkt(left.xy[0] + right.xy[0], left.xy[1] + right.xy[1]);
}

Nadal nie rozumiem, czemu nie możesz mieć 2 zmiennych tylko jakąś ohydną dynamiczną tablicę, ale to historia na inną bajkę.

0

Zrobiłem tak, że:

w plik h

friend punkt operator+(const punkt& left, const punkt& right);

w cpp:

punkt operator+(const punkt& left, const punkt& right)
{
	return punkt(left.xy[0] + right.xy[0], left.xy[1] + right.xy[1]);
}

w main:

punkt p0(2,3), p1(1,1), ph;
	ph=p0+p1;
	ph.wypisz();

i dalej błąd :/

0

Dobra wywaliłem tablicę dynamiczną i działa, widocznie coś miałem źle z nią związane.

0

Program się kompilował, ale podczas odpalenia niby wyliczał dwie wartości ale jakieś śmieci i przerywał działanie.

0

Mam jeszcze pytanie, trochę odbiegające od tematu, czy mogę zapisać tak:

if(wartosci[flaga_min]<=fpodb<wartosci[flaga_max])

gdzie oczywiscie wszystkie trzy wartosc to double, tylko dwie sa w tabeli a jedna normalnie. Czy lepiej zapisać:

if(wartosci[flaga_min]<=fpodb && fpodb<wartosci[flaga_max])
1

Pierwsza wersja nie zadziała tak jak oczekujesz.
Zostanie to potraktowane jako: if((wartosci[flaga_min]<=fpodb?1:0)<wartosci[flaga_max])

1

Pierwsze wyrażenie nie jest równoważne drugiemu.
W pierwszym wartosci[flaga_min]<=fpodb zwraca wartość true lub false i ta wartość jest porównywania z wartosci[flaga_max]
W drugim porównujesz tak jak widać.

0

Czyli jak mam to wyrażenie pierwsze:

if(wartosci[flaga_min]<=fpodb<wartosci[flaga_max])

napisane w pseudokodzie ze źródła, to żeby tak zadziało muszę użyć wyrażenia drugiego z operatorem &&, tak?

0

Ostatnie pytanie, gdyż właśnie kończę. Jak mam funkcje, która zwraca mi obiekt, np:

punkt sympleks_NM()
{
        punkt wynik;
        ....
	return wynik=tab_punktow[flaga_min];
}

To mogę wyświetlić wynik za pomocą np:

sympleks_NM().wypisz();

gdzie funkcje wypisz ma mniej wiecej tak:

void punkt::wypisz()
{
	cout<<"("<<x<<";"<<y<<")"<<endl;
}

??

1

twoja funkcja zwraca wartość tymczasową, więc musisz zadeklarować, że funkcja wypisz nie zmienia obiektu
void punkt::wypisz() const

0

Czyli zwyczajnie:

void punkt::wypisz() const
{
	cout<<"("<<x<<";"<<y<<")"<<endl;
}

??

0
cout << '(' << x << ';' << y << ')' << endl;
0

Może ktoś będzie wiedział, da się eksportować dane z tablicy obiektów do xls (excel)?
Dane jak np double/int to nie ma problemu. Tylko zastanawiam się jak zapisać dane z tablicy punktów, gdzie każdy wygląda punkt ma dwie wartości (x,y) i je bym chciał zapisać...

0

Najprostszy sposób:

ofstream fout("test.xls");
fout<<3<<"\t"<<4<<endl;
fout<<5<<"\t"<<6<<endl;
fout<<7<<"\t"<<8<<endl;

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