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

Widoczność obiektu w innych klasach

0 głosów
540 wizyt
pytanie zadane 26 kwietnia 2015 w C i C++ przez LislaV Bywalec (2,400 p.)

Mam taki kod:

 

void Engine::run(RenderWindow &window)
{
    ...//jakis kod

    snake.create();
    apple.create(&snake);
    
    ...//jakis kod
}
void Apple::create(Snake *s)
{
    size = 30;

    apple.setSize(Vector2f(size, size));
    apple.setFillColor(Color::Red);
    snake = s;
    setNewPosition();
}
void Apple::setNewPosition()
{
    srand(time(NULL));
    bool repeat;
    do
    {
        repeat = false;
        int x = rand() % 24;
        int y = rand() % 21;
        position.x = 10 + x*size;
        position.y = 90 + y*size;

        if (snake->getHeadPosition() == position)
            repeat = true;
        else
        {
            for (int i = 0; i < snake->getLength(); i++)
            {
                if (snake->getBodyPosition(i) == position)
                    repeat = true;
            }
        }

    } while(repeat);

    apple.setPosition(position);

}

Jak widać, żeby w metodzie Apple::setNewPosition() mieć dostęp do metod obiektu snake muszę przekazać wskaźnik do tego obiektu w argumencie. Moje pytanie - czy da się zrobić tak, żeby ten obiekt s​nake był widoczny w klasie Apple i innych klasach jakie jeszcze utworze? Chodzi mi o to, żeby nie trzeba było podawać go jako argumentu.

1 odpowiedź

+1 głos
odpowiedź 26 kwietnia 2015 przez Ehlert Ekspert (215,230 p.)

Wydaje mi się, że mógłbyś obiektowo inaczej podzielić grę:

  • okno
  • wąż
  • jabłko

Wszystko zawiera się w klasie silnik która jest zapzyjaźniona z powyższymi obiektami. W takim przypadku metoda losowania miejsca dla jabłka znajduje się w klasie Engine. Korzystasz z publicznych interfejsów i nie musisz się martwić przesyłaniem wskaźników. 

komentarz 26 kwietnia 2015 przez LislaV Bywalec (2,400 p.)
Dzięki :) Tak też zrobiłem. Czyli teraz praktycznie nie muszę używać tych 'setterów i getterów', jeżeli klase węża i jabłka mam zaprzyjaźnioną z klasą silnika?
komentarz 26 kwietnia 2015 przez Ehlert Ekspert (215,230 p.)
Tak, mimo wszystko polecam nie używać przyjaźni. Jest to pewne rozwiązanie ale teoretycznie burzy porządek hermentyzacji danych w klasie.
komentarz 26 kwietnia 2015 przez LislaV Bywalec (2,400 p.)
Czyli lepiej w tym wypadku zrezygnować z tego zaprzyjaźnienia z klasą silnika i używać setterów/getterów, dobrze rozumiem?
komentarz 26 kwietnia 2015 przez Ehlert Ekspert (215,230 p.)
Tak. Masz większy porządek. Klasa ma schemat i nie wnikasz w sekcję prywatną.
komentarz 26 kwietnia 2015 przez LislaV Bywalec (2,400 p.)
Okej. Dziękuję :)

Podobne pytania

0 głosów
1 odpowiedź 294 wizyt
0 głosów
1 odpowiedź 811 wizyt
0 głosów
1 odpowiedź 256 wizyt
pytanie zadane 5 stycznia 2019 w PHP przez roxy32l Początkujący (470 p.)

93,740 zapytań

142,675 odpowiedzi

323,294 komentarzy

63,319 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.

...