Tablica z obiektami klasy.

Tablica z obiektami klasy.
MonkiKong
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 26
0

Hej! Napisałem coś takiego(kod niżej) i gdy kompiluje ten program wydaje mi się, że podaje mi zły rozmiar elementu tablicy.
Jestem w pracy i korzystam z kompilatora online, dokładnie tego http://www.compileonline.com/compile_cpp11_online.php
wydaje mi się, że powinienem dostać wartość min 12, a nie 8 jak mi zwraca.

Kopiuj
#include <iostream>
using namespace std;

class OBIEKTY
{
    public:
    int b;
    int c;
    int d;
    OBIEKTY(int a,int a1,int a2){b=a;c=a1;d=a2;}
    void Wyswietl(){cout<<b<<" "<<c<<" "<<d<<endl;}
};

int main()
{
   OBIEKTY *TAB[20];
   for(int i=0;i<20;i++)
   {
   TAB[i]=new OBIEKTY(rand()%20,rand()%20,rand()%20);
   }
   
   for(int i=0;i<20;i++)
   {
   TAB[i]->Wyswietl();
   }
   
   for(int i=0;i<20;i++)
   {
   cout<<sizeof(TAB[i])<<" "<<sizeof(TAB+i)<<endl;
   }
   return 0;
}
 
n0name_l
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 2412
2

Dobrze pokazuje. Wyswietlasz rozmiar wskaznika, a nie tablicy.

Shalom
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Space: the final frontier
  • Postów: 26433
1

o_O Ale przeciez ty wyświetlasz rozmiar wskaźników a nie obiektów. Wskaźniki będą miały 4 albo 8 bajtów w zalezności od architektury.

MonkiKong
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 26
0

Ok, to by wyjaśniało wszystko. Jak w takim razie wyświetlić rozmiar obiektu umieszczonego w tablicy?

Azarien
  • Rejestracja: dni
  • Ostatnio: dni
1
Kopiuj
class OBIEKTY

nie nazywaj liczbą mnogą klasy, która reprezentuje jeden obiekt.

Jak w takim razie wyświetlić rozmiar obiektu umieszczonego w tablicy?

Skoro TAB[0] jest wskaźnikiem, to obiektem jest *TAB[0].

Shalom
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Space: the final frontier
  • Postów: 26433
0

@MonkiKong nie będzie. Użyj <vector> albo <list> albo <map> albo innego kontenera który wyda sie sensowny.

DO
  • Rejestracja: dni
  • Ostatnio: dni
0
MonkiKong napisał(a):

Hej! Napisałem coś takiego(kod niżej) i gdy kompiluje ten program wydaje mi się, że podaje mi zły rozmiar elementu tablicy.
Jestem w pracy i korzystam z kompilatora online, dokładnie tego http://www.compileonline.com/compile_cpp11_online.php
wydaje mi się, że powinienem dostać wartość min 12, a nie 8 jak mi zwraca.

Kopiuj
#include <iostream>
using namespace std;

class OBIEKTY
{
    public:
    int b;
    int c;
    int d;
    OBIEKTY(int a,int a1,int a2){b=a;c=a1;d=a2;}
    void Wyswietl(){cout<<b<<" "<<c<<" "<<d<<endl;}
};

int main()
{
   OBIEKTY *TAB[20];
   for(int i=0;i<20;i++)
   {
   TAB[i]=new OBIEKTY(rand()%20,rand()%20,rand()%20);
   }
   
   for(int i=0;i<20;i++)
   {
   TAB[i]->Wyswietl();
   }
   
   for(int i=0;i<20;i++)
   {
   cout<<sizeof(TAB[i])<<" "<<sizeof(TAB+i)<<endl;
   }
   return 0;
}
 

powinno być przy size off:

Kopiuj
cout<<sizeof(*(TAB[i]))<<" "<<sizeof(*(*(TAB+i))))<<endl;

Dlatego że *TAB[20] jest tablicą 20 elementową wskaźników do obiektów typu Obiekt wiec wartość na która wskazujemy to *(TAB[i])
Uzycie w drugim sizeof tab jest wsaznikiem wskazujący na i-ty wskaźnik znajdujacy się w tablicy Tab, który wskazuje na obiekt klasy Obiekt.

Uff
Mam nadzieje ze pomogłem :P

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.