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

Które rozwiązanie jest lepsze i dlaczego?

Object Storage Arubacloud
0 głosów
262 wizyt
pytanie zadane 6 lipca 2022 w C i C++ przez Daaa22 Dyskutant (8,250 p.)

Chce stworzyć strukturę która jest parą uporządkowanych liczb. Które z tych rozwiązań powinno zostać użyte i dlaczego? A może jeszcze jakieś inne?

template<typename T>
struct Point
{
	T x, y;

        //pierwsze
	Point operator + (Point point)
	{
		return { x + point.x, y + point.y };
	}

        //drugie
	Point operator + (Point point) const
	{
		return { x + point.x, y + point.y };
	}

        //trzecie
	inline Point operator + (Point point)
	{
		return { x + point.x, y + point.y };
	}

        //czwarte
	inline Point operator + (Point point) const
	{
		return { x + point.x, y + point.y };
	}
};

Zauważyłem też że można "inline" dodać przed "Point" i po "Point", czym to się różni?

Jeszcze mogę w argumentach operatora wpisać (Point& point), powinienem to zrobić?

2
komentarz 6 lipca 2022 przez j23 Mędrzec (194,920 p.)
Jawne inline'owanie metod, które są zdefiniowane wewnątrz klasy, jest zbędne, ponieważ takie metody są domyślnie inline.

1 odpowiedź

+1 głos
odpowiedź 6 lipca 2022 przez Oscar Nałogowiec (29,290 p.)

Podany operator + (tak jak i normalne, matematyczne) jest symetryczny względem argumentów, więc IMHO powinien być zaimplementowany jako funkcja (być może zaprzyjaźniona) a nie jako metoda klasy, bo w tym drugim przypadku oba argumenty traktowane są różnie. Metoda jest fajna dla np. operatora +=.


Przekazanie parametrów jako referencji jest całkiem OK - mniej pomocniczych konstruktorów się wykona.

Żaden z argumentów się nie zmienia więc przydałoby się parę const.

 

komentarz 6 lipca 2022 przez Daaa22 Dyskutant (8,250 p.)

Czyli coś takiego?

template<typename T>
struct Point
{
    T x, y;
 
    const Point<T>add( Point<T>&point )
    {
        return { x + point.x, y + point.y };
    }
}

Czy to jest idealne rozwiązanie?

2
komentarz 6 lipca 2022 przez j23 Mędrzec (194,920 p.)

Raczej to:

template<typename T>
struct Point {
    T x, y;
    
    using this_type = Point<T>;

    this_type operator+(const this_type &p) const
    {
        return { x + p.x, y + p.y };
    }

// lub

    friend this_type operator+(const this_type &p1, const this_type &p2)
    {
        return { p1.x + p2.x, p1.y + p2.y };
    }

};

 

komentarz 6 lipca 2022 przez Daaa22 Dyskutant (8,250 p.)

Fragment

using this_type = Point<T>;

Jest tylko dla czytelności kodu i nie ma wpływu na działanie programu?

I dlaczego zrobiłeś wewnątrz nawiasu 2 razy "const this_type"? Nie wystarczy zrobić jeden, a drugi w domyśle będzie przez program znajdowany?

komentarz 6 lipca 2022 przez j23 Mędrzec (194,920 p.)

Jest tylko dla czytelności kodu i nie ma wpływu na działanie programu?

Tak.

I dlaczego zrobiłeś wewnątrz nawiasu 2 razy "const this_type"?

Dałem dwie wersje: pierwsza operator jako metoda, druga - funkcja zaprzyjaźniona.

komentarz 6 lipca 2022 przez Daaa22 Dyskutant (8,250 p.)
Czy te wersje się technicznie czymś różnią? Której używać? I dlaczego w tych miejsca dać const?
1
komentarz 6 lipca 2022 przez j23 Mędrzec (194,920 p.)

Technicznie różnią się tym, że jedna definiuje metodę, a druga funkcję. Której używać? Którą chcesz.

const w parametrach dajesz, by móc przekazywać przez referencję obiekty const.

Metoda jest const po to, by móc ją wywoływać na rzecz obiektu const.

Podobne pytania

0 głosów
1 odpowiedź 118 wizyt
pytanie zadane 5 stycznia 2021 w PHP przez wizarddos Nałogowiec (25,930 p.)
0 głosów
1 odpowiedź 146 wizyt
pytanie zadane 9 września 2020 w HTML i CSS przez Bartek12 Mądrala (5,510 p.)
0 głosów
1 odpowiedź 157 wizyt

92,551 zapytań

141,393 odpowiedzi

319,523 komentarzy

61,936 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!

...