2009-02-28 25 views
1

Basit bir bellek yöneticisinde kullanmak için kendimden dinamik bir dizi uygulamam gerekiyor.Dinamik dizi için operatör [] nasıl kullanılır?

struct Block {  
    int* offset; 
    bool used; 
    int size; 
    Block(int* off=NULL, bool isUsed=false, int sz=0): offset(off), used(isUsed), size(sz) {} 
    Block(const Block& b): offset(b.offset), used(b.used), size(b.size) {} 
}; 

class BlockList { 
    Block* first; 
    int size; 
public: 
    BlockList(): first(NULL), size(0) {} 
    void PushBack(const Block&); 
    void DeleteBack(); 
    void PushMiddle(int, const Block&); 
    void DeleteMiddle(int); 
    int Size() const { return size; } 
    void show(); 
    Block& operator[](int); 
    Block* GetElem(int); 
    void SetElem(int, const Block&); 
    ~BlockList(); 
}; 

operator[]'a aşırı yüklenmem gerekiyor.

Block& BlockList::operator\[\](int index) { 
    try { 
     if (index >= size) 
      throw out_of_range("index out of range"); 
     else 
      return (first[sizeof(Block)*index]); 
    } 
    catch(exception& e) { 
     cerr << e.what() << endl; 
    } 
} 

void BlockList::PushBack(const Block& b) { 
    if(!size) 
     first = new Block(b); 
    else { 
     Block* temp = new Block[size + 1]; 
     int i = 0; 
     for (i = 0; i < size; i++) 
      temp[sizeof(Block)*i] = this->operator[](i); 
     delete []first; 
     temp += sizeof(Block); 
     temp->offset = b.offset; 
     temp->size = b.size; 
     temp->used = b.used; 
     first = temp; 
    } 
    size++; 
} 

Ben ilk elemanını itmek için PushBack kullanmak, Tamam çalışır, ancak ikinci gelince, üçüncü, ..., programın çökmesine vermedi, ama sadece sonuçları Ben didn` gösterir görmeyi bekliyorum. Yalnızca endeksinde geçmek gerekir böylece

void BlockList::show() { 
    for (int i = 0; i < size; i++) { 
     Block current(operator[](i)); 
     cout << "off: " << current.offset << " size: " << current.size << endl; 
    } 
} 
+0

Neden std :: vector kullanılmıyor? Bellek yöneticinizle çalışmasını istiyorsanız, özel bir ayırıcıyı iletin. Yanlış problemi çözüyorsun gibi görünüyor. – jalf

+0

Çünkü bu çalışmanın amacı bir derleyicinin kendisini derleme yeteneği elde etmektir, bu yüzden STL ve şablonlarını kullanamıyorum - şablonları sıfırdan uygulamak çok zor – chester89

cevap

3

ilk bir Blok göstericidir: Ben dizinin içeriğini almak nasıl Burada

olduğunu.

Blok * ilk; Eğer sizeof içeride kullandığınız için ilk ne zaman endeksleme örnekte ...

first[0] //returns the first element 
first[1] //returns the second element 

bir endeks değeri çok yüksek içinde geçmektedir.

Düzeltilmiş kodu:

Block& BlockList::operator[](int index) { 
    try { 
     if (index >= size) 
      throw out_of_range("index out of range"); 
     else 
      return (first[index]);//<--- fix was here 
    } 
    catch(exception& e) { 
     cerr << e.what() << endl; 
    } 
} 
1

Bir dizi unsurları ne kadar büyük bilir, bu yüzden sizeof(Block) ile matematik yapmak gerekmez. İndeks olarak sadece i kullanın.

İlgili bir notta, C++ FAQ Lite, her türlü yararlı malzemeyi kapsayan operatör aşırı yüklemesiyle ilgili harika bir bölüme sahiptir.

İlgili konular