• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Przeładowywanie operatorów dla obiektów dynamcznych i statycznych, szablony

Object Storage Arubacloud
0 głosów
109 wizyt
pytanie zadane 5 maja 2019 w C i C++ przez Grzegorz Szwarc Początkujący (320 p.)

Używałem wyszukiwarki google ale nie znalazłem wyczerpującej odp .

Jak za pomocą szablonu przeładować operator np * ? Dla przykładu: Mam klasę ułamek która posiada 2 zmienne int, i mogę mieć utworozne obiekty dynamicznie i statycznie. Nie chcę osobno przeładowywać operatora * dla obiektów statycznych i dynamicznych. Czy jest to możliwe? Albo istnieje jakiś lepszy mechanizm?
Idąc dalej za ciosem, co jeśli dwa obiekty które będę mnożył są utworzone dynamicznie i wynik chciałbym zwrócić do obiektu statycznego. To musiałbym kilka razy przeładować operator z rożnymi argumentami. Kod dla zobrazowania problemu:

class ulamek
{
	int licznik;
	int	mianownik;
public:
	ulamek(int x, int y) :licznik(x), mianownik(y) {};
	ulamek operator *(const ulamek & b)
        {
	      return ulamek(this->licznik * b.licznik, this->mianownik * b.mianownik);
        }
}

I w mainie:

int main()
{
	ulamek wynik(1, 1);
	ulamek UL1(1, 2);
	ulamek UL2(3, 4);

wynik = UL1 * UL2; // wynik  ma być równy (1*3,2*4)
}

Jeżeli źle zrozumiałem szablony i nie da się tak tego zrobić to poszukuję rozwiązania jak tak żeby nie klepać kodu dla każdego przypadku.

Z góry dziękuję za pomoc! smiley

1 odpowiedź

+1 głos
odpowiedź 5 maja 2019 przez adrian17 Ekspert (344,860 p.)
wybrane 5 maja 2019 przez Grzegorz Szwarc
 
Najlepsza

Nie za bardzo rozumiem. Ten kod wygląda jak normalna implementacja operatora. Kod wygląda poprawnie, nie ma tu żadnego problemu.

Nie chcę osobno przeładowywać operatora * dla obiektów statycznych i dynamicznych

Nie ma czegoś takiego. Nie wiem, o czym mówisz.

Nie rozumiem, co szablony mają do tego - one tu nigdzie nie są potrzebne.

komentarz 5 maja 2019 przez Grzegorz Szwarc Początkujący (320 p.)
int main()
{	
        ulamek* wsk1 = new ulamek(1, 1);
	ulamek* wsk2 = new ulamek(4, 5);
 	ulamek* wyn_wsk = new ulamek(4, 5);

	wynik_wsk = wsk1 + wsk2; // nie zadziała dla definicji operatora podanej na początku
}

Chcę załatwić wszystkie przypadki za pomocą jednej definicji przeładowania operatora, bo przecież taki kod dla przeładowanego operatora * jaki podałem na poczatku NIE zadziała dla obiektów dynamicznych, tak jak powyżej.

komentarz 5 maja 2019 przez adrian17 Ekspert (344,860 p.)

Nie zadziała, ale to już tak:

*wynik = *wsk1 + *wsk2;

Natomiast obiekt `ulamek` jest z założenia na tyle lekki, że w 99% przypadków nie powinno być powodu alokować go dynamicznie, więc ten problem w zasadzie jest do zignorowania. Podobnie w std::string, ludzie zazwyczaj nie robią `new std::string` albo `new boost::rational` i nie zastanawiają się nad dodawaniem ich wskaźników.

komentarz 5 maja 2019 przez Grzegorz Szwarc Początkujący (320 p.)
Ok ale to jest tylko przykład do nakreślenie problemu, mogę mieć taka potrzebę przy dużo większym programie. Dzięki

Podobne pytania

0 głosów
1 odpowiedź 196 wizyt
0 głosów
1 odpowiedź 303 wizyt
pytanie zadane 23 października 2015 w C i C++ przez 0xf Dyskutant (8,180 p.)
0 głosów
2 odpowiedzi 371 wizyt
pytanie zadane 17 października 2015 w C i C++ przez 0xf Dyskutant (8,180 p.)

92,539 zapytań

141,382 odpowiedzi

319,479 komentarzy

61,928 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...