Składnik klasy dostępny dla innej klasy

0

Mam krótkie i szybkie pytanie. Weźmy klasę Level:

 
class Level
{
private:
	sf::View View;
	Image Background;
	Character Hero;
	//itd. różne pierdoły związane z wyświetlaniem poziomu
	int BarrierCounter; 
public:
	//konstruktory, destruktor, etc.

I teraz chciałbym, żeby klasa Character miała dostęp do zmiennej int BarrierCounter; Np. w funkcji Hero.Jump(...), żebym mógł korzystać z BarrierCountera. Oczywiście mógłbym przekazywać tą zmienną przez referencję, np. Hero.Jump(..., int &BarrierCounter), ale właśnie chciałbym tego uniknąć, nie chcę dodawać kolejnych argumentów. Czy jest jakiś sposób, żeby Hero miał dostęp do BarrierCounter bez przekazywania go do funkcji? Albo nawet, żeby ta zmienna była widoczna dla wszystkich klas, bo nie wykluczone, że przyda się też gdzie indziej.

0

Zrób ją publiczną?

0
friend class Character;
0

A co jeśli klasa Level ma obiekt klasy Character to jak to zrobić, żeby ten obiekt miał dostęp do składnika klasy Level? Bo gdyby obiekt tej klasy Character był poza obiektem klasy Level to bym sobie za pomocą friend class poradził. A w takim wypadku to nie wiem jak to zrobić. A jeśli zrobię ją publiczną to jak mam się do niej odwoływać w obiekcie klasy Character, który jest obiektem właśnie tego Levela?

1

W konstruktorze przekaz pointer do parenta i za jego pomoca sie odwoluj.

1

A w czym przeszkadza zawieranie się klas?
Klasa Character musi mieć wskaźnik do klasy rodzica:

Character::Character( Level* Parent )

Wtedy robisz:

m_Parent->m_Element;

dodanie znaczników <code class="cpp"> - fp

0

Okej dziękuję, teraz już sobie poradzę :)

0

dopisz akcesora zgodnie z prawidłami sztuki, a nie kombinuj jak łysy koń pod górę.
Nie ma nic gorszego, niż gdy klasa A grzebie bezpośrednio po bebechach klasy B.

0

@MarekR22
Właściwie to by miało sens tylko w przypadku gdy dana klasa tworzy coś w rodzaju interfejsu. ;)

Przykładowo - Mamy klasę CObraz.
Do tego robimy zestaw interfejsów do manipulacji obrazem - skalowanie etc.
Interfejs w konstruktorze przyjmuje wskaźnik na klasę CObraz.

Wtedy interfejsy muszą mieć dostęp do prywatnych składowych klasy obraz ( nooo... Na upartego można zrobić akcesory, ale w tym wypadku to bez sensu ).
Dziedziczenie?
Można, ale pobierając wiele interfejsów można zrobić wygodnie rozszerzalną biblioteczkę ;).
Szkoda tylko, że friend nie działa na namespace.

0

Pierwszy raz słyszę stwierdzenie 'akcesor'. Ale dobrze rozumiem, że chodzi o metodę, którą zwraca składową prywatną, tak?

0

Akcesory => metody dostepowe, najczesciej 2 -> geter i seter. Wprowadzasz w nich logike biznesowa, czyli wszelkie restrykcje dotyczace stanu zmiennych.

Przyklad, masz klase Czlowiek

class Czlowiek
{
private: unsigned wiek;
}

I np. chcesz wprowadzic gorna granice wieku na 128, wtedy jak dasz bezposredni dostep do zmiennej, to user nie bedzie musial przestrzegac tego.
Jest to taka forma kontroli, czujemy sie wladcami, wiec udostepniamy niezbedne minimum.

Akcesory przydaja sie tez w czasie testowania softu, jakies mockowanie or sth.

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