wskaźnik do składników klasy

0

Załóżmy, że mamy następującą klasę:

 
class T
{
public:
         int a;
         int tab[10];
         int *wsk;
         T()
         {
              wsk = new int[10];
              for(int i = 0; i < 10; i++)
              {
                   wsk[i] = 0;
                   tab[i] = 0;
              }
              a = 0;
};

Teraz chciałbym zdefiniować wskaźnik na każdą ze składowych tej klasy. Chciałem to zrobić przez analogię do zwykłych wskaźników, np:

 
int tab[10];
int *wsk = tab; // lub &tab[0]

Jednak wygląda na to, że zapis wskaźników do składników klasy nie jest zbyt intuicyjny.
Co do zmiennej "a" nie ma problemów:

T object;
T *objectD = new T();
int T::*wskA = &T::a;

cout<<object.*wskA; // lub cout<<objectD->*wskA;
 

Wskaźnik na tablicę "tab" wewnątrz klasy T chciałem zapisać tak jak na zwykła tablicę, ale z operatorem zakresu :

int T::*wskTab = T::tab; // lub &T::tab[0];
 

jednak zapis taki okazał się błędny.

Ostatecznie doszedłem do tego, że deklarację wskaźników powinienem zapisać tak, jednak nie jestem do końca pewien:

 
int (T::*wskTab)[10] = &T::tab;  // przypisanie do zwykłego wskaźnika czegoś w stylu "&tab" jest błędne, więc zastanawia mnie jak to tutaj działa
int *(T::*wskWsk) = &T::wsk; 

Czy powyższe definicje są poprawne ? Jak wytłumaczyć różnice w definiowaniu zwykłych wskaźników, a wskaźników do składników klasy (zapis przez analogię do zwykłej tablicy tab był błędny).

Jak odczytać wartości ze wskaźników wskTab i wskWsk ? ( wykorzystując obiekt tej klasy, tak jak to zrobiłem dla zmiennej "a")

0

tak samo jak w przypadku zwykłych zmiennych:
int *wsk;
int tab[5];
możesz mieć wskaźnik na wskaźnik:
int **wskwsk=&wsk;
natomiast nie możesz zrobić wskaźnika na tab, ponieważ sama "tab" jest tak jakby wartością stalą nie możesz jej zmieniać nie ma jej w pamięci komputera.

0

Czyli zapis:

 
int (T::*wskTab)[10] = &T::tab;

nie ma sensu.

Udało mi się odszukać taki temat: http://4programmers.net/Forum/C_i_C++/164122-Wska%C5%BAnik_do_sk%C5%82adowej_klasy_b%C4%99d%C4%85cej_tablic%C4%85 i już sam nie wiem jak to jest.

Natomiast zapis:

 
int *(T::*wskWsk) = &T::wsk;

jest poprawny i bardziej logiczny niż to co powyżej. Wartość można odczytać tak:

//dla elementu o indeksie 0
cout<<*(object.*wskWsk); // lub cout<<*(objectD->*wskWsk)    
//dla elementu o większym indeksie np 1:
cout<<*(object.*wskWsk + 1); // lub cout<<*(objectD->*wskWsk +1)    
 

i jest to chyba jedyny możliwy zapis.

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