Kompozycja - użycie metody na obiekcie w innej klasie

0

Jeśli mam obiekt innej klasy w klasie i chcę wywołać metodę na tym obiekcie z innej klasy to ta metoda będzie public, czy są jakieś sposoby aby metoda była private i było można jej użyć na obiekcie w innej klasie ?

1

Jest, mozesz te klasy zaprzyjaźnić na przykład, co da spodziewany efekt. Ale to jest bardzo rzadko dobre rozwiązanie. Zwykle wskazuje raczej na to, że zrypałeś design sowjej aplikcji.

4

Ja tam na cpp się nie znam, @kq jest ekspertem, ale czy nie chodzi ci o klasy zaprzyjaźnione?

0

Metoda private jest używalna tylko wewnątrz własnej klasy i nie można użyć jej publicznie nie łamiąc enkapsulacji.

Można posłużyć się friend ale to łamanie enkapsulacji:

#include<iostream>

class a{
    friend class b;
    void foo(){ std::cout << "foo\n"; }
};

struct b
{
    b()
    {
        a obj;
        obj.foo();
    }
};

int main()
{
    b obj;
    return 0;
}
0

aha, to co zrobić jeśli mam klasę o nazwie Gra oraz klase o nazwie Plansza. W klasie Gra sprawdzam czy plansza jest zapełniona za pomocą metody z klasy plansza: plansza.sprawdz(), więc ta funkcja jest publiczna, jak mam sprawdzić czy plansza jest pełna jeśli metoda byłaby prywatna i nie używałbym frienda ?

1

Wtedy nie ma takiej możliwości. Jeśli twórca klasy uznał że nie masz dostępu do jakiegoś pola/metody to go nie masz i tyle. Zwykle jest ku temu powód, bo np. niepoprawne użycie mogłoby mieć jakieś złe skutki.

0

Załóżmy, że mam klase Gra, która odpowiada za start gry itd., natomiast w klasie plansza jest tablica zawierającą plansze to jak w klasie Gra sprawdzać które pole na planszy jest zajęte itp ?

0

Czy wtedy to się robi wszystko w mainie działając na obiekcie klasy Gra i obiekcie klasy Plansza oddzielnie ?

1

Klasa Gra ustala współrzędne, a publiczna metoda klasy Plansza zwraca false jeżeli nie można postawić tam pionka. Obiekt klasy Plansza jest polem klasy Gra.
Odpowiadając na pytanie: W mainie działasz na obiekcie klasy Gra i jeżeli wszystko jest dobrze napisane to w sumie powinieneś odpalić tylko Gra gr; gr.start();. Reszta powinna zrobić się sama.

0

Tak, zgadza się, ale jeśli mam obiekt klasy plansza w klasie Gra to metoda klasy Plansza musi być publiczna. Wcześniej napisaliście, że nie należy ustawiać metod jako publicznych. To w tym przypadku można ? Bo właśnie piszę tak swój program, że niektóre metody muszą być publiczne jak chcę je w innej klasie użyć.

1

Wtedy po ludzku rozdziela się odpowiedzialności. Zastanów się kto ma stwierdzić czy dane pole jest zajęte czy nie. Czemu uważasz ze to Gra powinna to zrobić a nie Plansza? Nikt nie mówił że metody nie mogą byc publiczne. Ba, niektóre nawet powinny! Ale tylko te których potrzebuje ktoś z zewnątrz.

0

ok rozumiem. bo właśnie napisałem grę w której używam dużo metod publicznych z powodu tego, że obiekt znajduję się w innej klasie i myślałem po waszych pierwszych wypowiedziach, że to nie jest ok.

1 użytkowników online, w tym zalogowanych: 0, gości: 1