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 ?
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.
Ja tam na cpp się nie znam, @kq jest ekspertem, ale czy nie chodzi ci o klasy zaprzyjaźnione?
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;
}
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 ?
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.
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 ?
Czy wtedy to się robi wszystko w mainie działając na obiekcie klasy Gra i obiekcie klasy Plansza oddzielnie ?
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.
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ć.
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.
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.