2009-07-28 1 views
0

Пожалуйста, помогите мне создать вложенную структуру с массивом. Как исправить этот код?Вложенная структура с массивом

class CMain 
{ 
    public: 
     CMain(); 
     ~CMain(); 

    private: 
     struct 
     { 
      CCheckSum() : BufferSize(500) {memset(Buffer, 0, BufferSize);} 
      const int BufferSize; 
      char Buffer[BufferSize]; 
     }SmallBuffer; 
} 

Спасибо.

ответ

1

Статические массивы должны знать их длину во время компиляции, или вам нужно, чтобы динамически выделять память:

struct CCheckSum 
{ 
    CCheckSum() 
    : BufferSize(500), 
     Buffer(new char[BufferSize]) 
    { 
     memset(Buffer, 0, BufferSize); 
    } 
    ~CCheckSum() { delete[] Buffer; } // Note the use of delete[]! 
    const int BufferSize; 
    char* Buffer; 
}SmallBuffer; 

Вы, вероятно, лучше использовать std::vector хотя:

struct CCheckSum 
{ 
    CCheckSum() : Buffer(500, 0) {} 
    std::vector<char> Buffer; // A std::vector keeps 
           // track of its size enternally 
}SmallBuffer; 
+0

Я намеревался использовать массив, потому что мне нужно заполнить его последовательными блоками необработанных байтов данных. Push_back() это приведет к перераспределению, которое я хочу избежать. Если я объявляю вектор 500 байтов, как мне копировать, скажем, блоки из 100, 200 и 200 байтов в него один за другим, не помещая их побайтно с оператором []? – jackhab

+0

На самом деле, подумайте об этом, 'std: :(​​tr1: :) array', а не' std :: vector' - это правильная вещь для использования здесь, так как размер (предположительно) является константой времени компиляции , –

+0

Две вещи: 1) Вы не будете отталкиваться назад, у вас уже есть массив из 500 байтов. 2) Векторы хранятся в виде непрерывной памяти, поэтому вы можете использовать их как массивы raw-pointer. & Buffer [0] - указатель на начало массива, который может использоваться в функциях памяти c-style. – luke

0

Существует нет проблема, связанная с гнездом.

Массивы имеют постоянный размер. Либо сделайте BufferSize постоянным, либо используйте std :: vector вместо char [].

+0

Но я объявил BufferSize как const int. И я использую raw buffer, так как мне нужно сделать простую и быструю работу с необработанными данными, поступающими из сети. – jackhab

+0

Вам также нужно сделать его статическим. – AProgrammer

0

Размер массива не может быть изменен во время выполнения. Это должно быть известно во время компиляции. Вы можете использовать std :: vector для этого прецедента. Кроме того, имя структуры должно быть указано перед написанием конструктора с именем CCheckSum.

struct CCheckSum 
     { 
      CCheckSum() : .... 
2

Даже если вы объявили BufferSize в const, в области видимости класса это не объявлять во время компиляции константы, которая необходима для объявления размеров массивов в C++, но постоянный член данных, который после того, как установлен в конструктор, больше не может быть изменен для времени жизни экземпляра (но все равно может быть различным для каждого экземпляра).

два решения: Сделать

  1. BufferSizestatic const в области видимости класса или
  2. (просто) const в области видимости пространства имен (в том числе глобального масштаба).