Przeładowanie operator +

Przeładowanie operator +
C6
  • Rejestracja:ponad 11 lat
  • Ostatnio:8 dni
  • Postów:197
0

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

Kopiuj
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:

Kopiuj
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:

Kopiuj
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?

twonek
  • Rejestracja:około 11 lat
  • Ostatnio:około 2 lata
  • Postów:2500
0

Zwracanie referencji do zmiennej lokalnej:

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

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

C6
  • Rejestracja:ponad 11 lat
  • Ostatnio:8 dni
  • Postów:197
0

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

Kopiuj
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;
}
twonek
  • Rejestracja:około 11 lat
  • Ostatnio:około 2 lata
  • Postów:2500
1
Kopiuj
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ę.

C6
  • Rejestracja:ponad 11 lat
  • Ostatnio:8 dni
  • Postów:197
0

Zrobiłem tak, że:

w plik h

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

w cpp:

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

w main:

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

i dalej błąd :/

twonek
to podziel się jeszcze tym błędem
C6
  • Rejestracja:ponad 11 lat
  • Ostatnio:8 dni
  • Postów:197
0

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

C6
  • Rejestracja:ponad 11 lat
  • Ostatnio:8 dni
  • Postów:197
0

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

C6
  • Rejestracja:ponad 11 lat
  • Ostatnio:8 dni
  • Postów:197
0

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

Kopiuj
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ć:

Kopiuj
if(wartosci[flaga_min]<=fpodb && fpodb<wartosci[flaga_max])
_13th_Dragon
  • Rejestracja:prawie 20 lat
  • Ostatnio:3 miesiące
1

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


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
edytowany 1x, ostatnio: _13th_Dragon
Sopelek
  • Rejestracja:około 13 lat
  • Ostatnio:ponad 8 lat
  • Lokalizacja:Kraków
  • Postów:467
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ć.

C6
  • Rejestracja:ponad 11 lat
  • Ostatnio:8 dni
  • Postów:197
0

Czyli jak mam to wyrażenie pierwsze:

Kopiuj
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?

C6
  • Rejestracja:ponad 11 lat
  • Ostatnio:8 dni
  • Postów:197
0

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

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

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

Kopiuj
sympleks_NM().wypisz();

gdzie funkcje wypisz ma mniej wiecej tak:

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

??

edytowany 3x, ostatnio: choracy69
Sopelek
  • Rejestracja:około 13 lat
  • Ostatnio:ponad 8 lat
  • Lokalizacja:Kraków
  • Postów:467
1

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

edytowany 1x, ostatnio: Sopelek
C6
  • Rejestracja:ponad 11 lat
  • Ostatnio:8 dni
  • Postów:197
0

Czyli zwyczajnie:

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

??

Sopelek
tak, ogólnie poczytaj o const-correctness i staraj się tego przestrzegać.
Azarien
  • Rejestracja:ponad 21 lat
  • Ostatnio:dzień
0
Kopiuj
cout << '(' << x << ';' << y << ')' << endl;
C6
  • Rejestracja:ponad 11 lat
  • Ostatnio:8 dni
  • Postów:197
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ć...

_13th_Dragon
  • Rejestracja:prawie 20 lat
  • Ostatnio:3 miesiące
0

Najprostszy sposób:

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

Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.