• 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

0 głosów
370 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 Mentor (355,240 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 Mentor (355,240 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ź 446 wizyt
0 głosów
1 odpowiedź 502 wizyt
pytanie zadane 23 października 2015 w C i C++ przez 0xf Dyskutant (8,180 p.)
0 głosów
2 odpowiedzi 769 wizyt
pytanie zadane 17 października 2015 w C i C++ przez 0xf Dyskutant (8,180 p.)

93,788 zapytań

142,753 odpowiedzi

323,429 komentarzy

63,393 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

Twierdza Linux. Bezpieczeństwo dla dociekliwych

Aby uzyskać rabat -10%, użyjcie kodu pasja-linux, wpisując go w specjalne pole w koszyku.

...