Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Dostęp do zmiennych z poziomu klasy gościa

Ostatnio zmodyfikowano 2013-10-07 20:11
Autor Wiadomość
ksbzw
Temat założony przez niniejszego użytkownika
Dostęp do zmiennych z poziomu klasy gościa
» 2013-10-07 13:31:39
Cześć!

Mam następujący problem: klasa A posiada kilka zmiennych w tym tablicę zmiennych klasy B. Chciałbym, żeby obiekty z klasy B mogły mieć dostęp do wszystkich zmiennych z klasy A.

Problem nie jest trywialny. Próbowałem już rozwiązać go na kilka sposobów. Dziedziczenie odpada na samym początku, ponieważ w tym przypadku jest bez sensu, a dodatkowo jeszcze jest niemożliwe. Próbowałem też z klasą zagnieżdżoną (B wewnątrz A oczywiście) i zaprzyjaźnioną. W takiej sytuacji dostęp owszem i jest, tylko kompilator wyrzuca błąd, że potrzebny jest konkretny obiekt do którego się odwołuję (niezależnie od tego, czy wywołuję zmienną z klasy A bezpośrednio po prostu przez jej nazwę, czy z kwalifikatorem dostępu.) Rozwiązaniem tego byłoby umieszczenie w każdym obiekcie klasy B wskaźnika do obiektu-matki klasy A. Tylko, że to rozwiązanie wydaje mi się nieeleganckie, w końcu mam niepotrzebnie całą tablicę takich wskaźników, a poza tym nie wiem jak to zrobić, żeby przekazać je wszystkie do klasy B.

Aha jeszcze od razu powiem, że pomysł z przeniesieniem tych zmiennych do klasy B i zrobieniem i static nie wypali, bo muszę mieć kilka obiektów klasy A, a wtedy wszystkie B miałby te same zmienne, a nie o to chodziło...
P-93305
pekfos
» 2013-10-07 15:01:34
Przyjaźń.
P-93307
ksbzw
Temat założony przez niniejszego użytkownika
» 2013-10-07 15:21:08
Normalnie może i owszem, ale tak jak wcześniej pisałem to nie rozwiązuje problemu, bo "IntelliSense: a nonstatic member reference must be relative to a specific object"

czyli coś takiego jak proponujesz:
C/C++
class B;
class A
{
    friend class B;
    int a;
    B tab[ 4 ];
};

class B
{
    int b;
    void fun() { b = A::a; }
};
nie kompiluje się nawet.

Czy jest jakiś sposób, żeby to rozwiązać inaczej niż pakowanie do KAŻDEGO obiektu klasy B wskaźnika do A? Swoją droga jak to zrobić przy tablicy?
P-93308
pekfos
» 2013-10-07 15:39:22
Nie możesz tak używać niestatycznych składowych.

Czy jest jakiś sposób, żeby to rozwiązać inaczej niż pakowanie do KAŻDEGO obiektu klasy B wskaźnika do A?
W tym przykładowym kodzie, tak.
P-93309
ksbzw
Temat założony przez niniejszego użytkownika
» 2013-10-07 15:54:25
To jak mam to zrobić?
P-93310
pekfos
» 2013-10-07 16:02:52
Przekaż referencję na A do metody B::fun() jako argument.
P-93311
kubawal
» 2013-10-07 16:05:53
friend działa tak, że bezpośrednio (tzn
A::skladowa
) możesz się odwoływać tylko do metod i zmiennych zadeklarowanych jako static
Żeby się odwoływać do reszty musisz mieć obiekt danej klasy.

W tym przykładzie musisz podać do jakiego konkretnie obiektu się odwołujesz, na przykładzie, masz typ zwierzęcia, np. pies, to nie możesz kazać typowi zwierzęcia iść. Musi wskazac jaki konkretnie pies ma iść.
P-93312
ksbzw
Temat założony przez niniejszego użytkownika
» 2013-10-07 18:30:37
Tak, wiem jak działa friend. Podobnie dostęp do wnętrza A mogę uzyskać jezeli zagnieżdżę B wewnątrz A. Ale o dziwo nawet wtedy kompilator wymaga podania konkretnego obiektu klasy A do którego się odwołuje. Zawsze chodzi jednak o ten wewnątrz którego jest B. Chodzi mi o coś podobnego do
super()
 w Javie, ale nie do końca: tam dotyczyło to dziedziczenia, a tu zakresów zmiennych.

Czyli jednak nie ma innego wyjścia jak wskaźnik na A wewnątrz B, tak? Pytanie jeszcze jak taki wskaźnik tam umieścić? Mogę zrobić konstruktor, który ustawia taki wskaźnik wewnątrz B, ale skoro obiekty B (i to cała tablica) są składowymi klasy A to zostanie uruchomiony dla nich konstruktor domniemany, a tu już nie widzę, jak można mu przekazać
this
 od klasy A.
P-93320
« 1 » 2
  Strona 1 z 2 Następna strona