2011-05-26 11 views
8

Varsa: C++: varsayılan olmayan kurucu kullanarak yapı üyesi dizisini dinamik olarak ayırma

struct a_struct 
{ 
    int an_int; 

    a_struct(int f) : an_int(f) {} 
    a_struct() : an_int(0) {} 
}; 

class a_class 
{ 
    a_struct * my_structs; 

    a_class() {...} 
}; 

Şunları yapabilirim:

a_class() {my_structs = new a_struct(1)} 
//or 
a_class() {my_structs = new a_struct [10]} 

Ancak yapamazsınız:

a_class() {my_structs = new a_struct(1) [10]} 
//or 
a_class() {my_structs = new a_struct() [10]} 

Bunu çalışması için herhangi bir doğru sözdizimi var mı? Ya da etrafta kolay bir iş mi?

cevap

5

STL bir seçenek kullanıyorsa, bir dinamik dizi yerine std :: vektörünü kullanabilirsiniz.

Bunun çalışacağını düşünüyorum :

std::vector<a_struct> my_structs; 

my_structs.assign(10, 1); 

değil, bu yapmalıdır:

my_structs.assign(10, a_struct(1)); 
+2

Ya da sadece 'std :: vector my_structs (10, 1); ' – Nemo

0

Sen işaretçiler için işaretçiler bir dizi kullanabilirsiniz. Sonra işaretçileri) (a_struct için yapacak dizi oluşturabilir, bu nedenle kullanılacak yapıcı sonra karar verebilirsiniz:

class a_class { 
    a_struct ** my_structs; 

    a_class() { my_structs = new a_struct* [10]} 
    void foo() { 
     my_structs[0] = new a_struct(1); 
     my_structs[5] = new a_struct("some string and float constructor", 3.14); 
    } 
}; 
+0

Bu, bir dizi yapının etrafından geçmenize izin vermez (veya yapının işaretçisini sonra dizinin sonraki öğesine geçmek için işaretçi matematiğini kullanır). – iheanyi

0

herhangi belirli parametreli yapıcı doğrudan bunu yapamaz. Yapabileceğiniz Ancak

a_struct *my_struct[10] = {}; // create an array of pointers 

for (int i = 0; i < 10; i++) 
    my_struct[i] = new a_struct(i); // allocate using non-default constructor 

ben bir std::vector kabı kullanarak yerine bu süreçte gidiş önermek

for (int i = 0; i < 10; i++) 
    delete my_struct[i] // de-allocate memory 

, bellek de-ayırmaya gidiyoruz zaman.

+1

Bu durumda std :: vector' nin avantajı, tüm my_struct'larının bitişik bir bellek bloğunda olacağıdır. – Xeo

+0

Bu, bir dizi yapının etrafından geçmenize izin vermez (veya yapının işaretçisini sonra dizinin bir sonraki öğesine geçmek için işaretçi matematiğini kullanır) – iheanyi

3

Hafızanın bir ham yığın tahsis ve her struct başlatmak için yerleştirme yeni kullanabilirsiniz: Ayrıca

int number_of_structs = 10; 
my_structs = (a_struct*)new unsigned char[sizeof(a_struct) * number_of_structs]; 
    // allocate a raw chunk of memory 
a_struct* p = m_structs; 
for (int i=0; i<number_of_structs; i++) 
{ 
    new (p) a_struct(i); 
    p++; 
} 

See: What uses are there for "placement new"?

İlgili konular