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

Cloud VPS
0 głosów
386 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 (195,240 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,360 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 (195,240 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 (195,240 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 (195,240 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ź 170 wizyt
pytanie zadane 5 stycznia 2021 w PHP przez wizarddos Nałogowiec (27,830 p.)
0 głosów
1 odpowiedź 196 wizyt
pytanie zadane 9 września 2020 w HTML i CSS przez Bartek12 Mądrala (5,510 p.)
0 głosów
1 odpowiedź 209 wizyt

93,485 zapytań

142,417 odpowiedzi

322,765 komentarzy

62,898 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

Kursy INF.02 i INF.03
...