2009-07-28 17 views
0

Bitte helfen Sie mir, eine verschachtelte Struktur mit einem Array zu erstellen. Wie behebe ich diesen Code?verschachtelte Struktur mit Array

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

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

Danke.

Antwort

1

Statische Arrays benötigen, um ihre Länge bei der Kompilierung wissen, oder Sie müssen dynamisch Speicher zuweisen:

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; 

Du bist wahrscheinlich besser dran std::vector obwohl mit:

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

Ich wollte Array verwenden, weil ich es mit aufeinanderfolgenden Blöcken von Rohdaten Bytes füllen muss. Push_back() wird eine Neuzuweisung verursachen, die ich vermeiden möchte. Wenn ich einen Vektor von 500 Bytes deklariere, wie kann ich Blöcke von 100, 200 und 200 Bytes hintereinander kopieren, ohne sie Byte für Byte mit dem Operator [] zu setzen? – jackhab

+0

Eigentlich, um darüber nachzudenken, ist 'std: :(​​tr1: :) array', nicht' std :: vector' die richtige Sache hier zu verwenden, da die Größe (soll sein) eine Kompilierzeitkonstante ist . –

+0

Zwei Dinge: 1) Sie würden nicht zurückdrängen, Sie haben bereits eine Reihe von 500 Bytes. 2) Vektoren werden als zusammenhängender Speicher gespeichert, sodass Sie sie wie Raw-Pointer-Arrays verwenden können. & Buffer [0] ist ein Zeiger auf den Anfang des Arrays, der in C-Style-Speicherfunktionen verwendet werden kann. – luke

0

Es gibt keine Problem im Zusammenhang mit der Verschachtelung.

Arrays haben konstante Größe. Machen Sie BufferSize entweder konstant oder verwenden Sie statt eines char [] einen std :: vector.

+0

Aber ich erklärte BufferSize als const int. Und ich benutze rohen Puffer, da ich eine einfache und schnelle Arbeit mit Rohdaten aus dem Netzwerk machen muss. – jackhab

+0

Sie müssen es auch statisch machen. – AProgrammer

0

Die Array-Größe kann zur Laufzeit nicht geändert werden. Es sollte zur Kompilierzeit selbst bekannt sein. Sie können std :: vector für diesen Anwendungsfall verwenden. Außerdem sollte der Name der Struktur angegeben werden, bevor der Konstruktor mit dem Namen CCheckSum geschrieben wird.

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

Auch wenn Sie BufferSize als const erklärt, bei Klassenbereich nicht ein Compiler-Konstante, nicht erklären, die für die Deklaration von Feldgrößen in C++, aber ein konstantes Datenelement benötigt wird, die, einmal in dem Satz Konstruktor, kann für die Lebensdauer der Instanz nicht mehr geändert werden (kann aber für jede Instanz noch unterschiedlich sein).

Zwei Lösungen:

  1. BufferSizestatic const im Gültigkeitsbereich der Klasse Stellen oder
  2. (nur) const bei Namespacebereich (globale Reichweite einschließlich).