Узнать размер экземпляра класса динамически

Тема в разделе "WASM.A&O", создана пользователем EvilsInterrupt, 9 ноя 2005.

  1. AsmGuru62

    AsmGuru62 Member

    Публикаций:
    0
    Регистрация:
    12 сен 2002
    Сообщения:
    689
    Адрес:
    Toronto
    Кстати, вот интересный код: (каждый объект знает свой размер!)
    Код (Text):
    1.  
    2. #include <stdio.h>
    3.  
    4. class Base {
    5.     private:
    6.         int array1 [8];
    7.  
    8.     public:
    9.         virtual int MySize () {
    10.             return sizeof (*this);
    11.         }
    12. };
    13.  
    14. class Next1 : public Base {
    15.     private:
    16.         int array2 [8];
    17.  
    18.     public:
    19.         virtual int MySize () {
    20.             return sizeof (*this);
    21.         }
    22. };
    23.  
    24. class Next2 : public Next1 {
    25.     private:
    26.         int array3 [8];
    27.  
    28.     public:
    29.         virtual int MySize () {
    30.             return sizeof (*this);
    31.         }
    32. };
    33.  
    34. int main ()
    35. {
    36.     Next1 object1;
    37.     Next2 object2;
    38.  
    39.     printf ("\n-- sizeof (object1) = %d bytes", object1.MySize ());
    40.     printf ("\n-- sizeof (object2) = %d bytes", object2.MySize ());
    41.  
    42.     return 0;
    43. }
    44.  
     
  2. EvilsInterrupt

    EvilsInterrupt Постигающий азы дзена

    Публикаций:
    0
    Регистрация:
    28 окт 2003
    Сообщения:
    2.428
    Адрес:
    Russia
    Занятно, блин, с помощью этого this разве что к богу недоступиться.
     
  3. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    EvilsInterrupt

    Похоже в файле нет явного указания числа параметров Data и явного признака конца массива данных. Поэтому, видимо, различие между заголовком BcpArchive и данными проводится по значению первого ворда 8-байтной записи: в Data старший (второй) байт CodeObj = 65h = 101, в то время как в BcpArchive этот байт = hour < 24.

    При загрузке в память конечно лучше добавить поле DataCount = количество элементов в массиве Data. Сохранять данные можно конечно по разному, но проще всего просто загрузить весь файл в память, а затем создать массив записей типа

    class BcpItem {

    BcpArchive *bcp //здесь в BcpArchive нужно указывать не указатель pData, а массив DATA

    int DataCount}

    Заполняем массив так: проверяем второй байт каждого 8-байтного блока; если < 24, то добавляем в массив новый элемент BcpItem и устанавливаем bcp = адресу блока и DataCount = 0; если >= 24, то делаем инкремент DataCount последнего элемента BcpItem
     
  4. infern0

    infern0 New Member

    Публикаций:
    0
    Регистрация:
    7 окт 2003
    Сообщения:
    811
    Адрес:
    Russia


    sizeof(BcpArchive) + N * sizeof(Data)
     
  5. EvilsInterrupt

    EvilsInterrupt Постигающий азы дзена

    Публикаций:
    0
    Регистрация:
    28 окт 2003
    Сообщения:
    2.428
    Адрес:
    Russia
    infern0



    Так но не совсем:

    (sizeof(BcpArchive)-4) + N * sizeof(Data)



    В файл не ложится указатель pData, который указывает на структуры Data
     
  6. _staier

    _staier New Member

    Публикаций:
    0
    Регистрация:
    3 окт 2003
    Сообщения:
    738
    Адрес:
    Ukraine
    господа , а как вы создадите такой обьект класса ?

    кроме как malloc /free



    с помощью new вам его ни за что не создать

    а раз так то ни конструкторов использовать нельзя ни деструкторов ни полиморфизьма какого

    а тогда нафига оно вообще надо классы эти ?
     
  7. green

    green New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2003
    Сообщения:
    1.217
    Адрес:
    Ukraine
    staier

    можно сделать для класса operator new, принимающий параметром размер.

    :derisive:



    IMHO лучше не держать в BcpArchive Data[], а только Data* и добавить в BcpArchive методы Serialize/Deserialize.
     
  8. EvilsInterrupt

    EvilsInterrupt Постигающий азы дзена

    Публикаций:
    0
    Регистрация:
    28 окт 2003
    Сообщения:
    2.428
    Адрес:
    Russia
    У меня вопрос:
    Код (Text):
    1.                         pBcpArchive = (BcpArchive *)(new char[SizeNewAttach]);
    2.                         if(!pBcpArchive)
    3.                         {return 10;}
    4.                 // Óñòàíîâêèì óêàçàòåëü íà íîâóþ çàïèñü(â äàëüíåéøåì àòòà÷)
    5.                         hBackup.seekg(SizeNewAttach,ios::end);
    6.                         if(hBackup.fail())
    7.                         { return 12; }
    8.                 // Ñîñ÷èòàåì çàïèñü â áóôåð
    9.                 hBackup.read((char *)(pBcpArchive),SizeNewAttach.operator long());
    10.                 if(hBackup.fail())
    11.                 { return 11; }


    У меня происходит ошибка чтения, хотел бы узнать почему, не знает ли кто не чтоподобное GetLastError для потоков?