C++

2011-12-11 12 views
14

'da bir kurucuyla bir nesne nesnesini dinamik olarak bildirme Nesnenin yapıcıya iletilen şeylere ihtiyacı olduğunda bir dizi nesne oluşturmanın mümkün olup olmadığını merak ediyorum.C++

MyClass *myVar; 
myVar = new MyClass[num]; // I would like to specify the array size after declaration 
int i = 0; 
for(i = 0;i < num;i++) 
    myVar[i] = new MyClass(0,0); // I would also like to populate the array with new objects 

umarım bu işe biliyoruz: Böyle bir şey istiyorum

MyClass *myVar; 
myVar = new MyClass[num]; 

ancak yapıcı ilgisi bu sadece çalışır içine geçti. Yapmaya çalıştığım şey mi? Eğer öyleyse, nasıl yaparım?

DÜZENLEME: Dizileri kullanarak nasıl yapılacağını öğrendim. Ben vektörleri ve bu tür kullanmak istiyorsunuz

MyClass **myVar; 
myVar = new MyClass *[num]; 
for(i = 0;i < num;i++) 
    myVar[0] = new MyClass(0,0); 

ama öğretmenim mümkünse temel diziler kullanmaya anlattı: İşte ben yaptım nasıl. Yukarıdaki çözüm aslında öğretmenimin yazdığı bazı kodlardan aldım. Yardımlarınız için hepinize teşekkür ederim!

cevap

21
MyClass *myVar; 
myVar = new MyClass[num]; 

Aslında bu formda, parametre (ler) alan kurucuyu çalıştıramazsınız. Dil belirtimine izin verilmiyor.

#include <vector> //header file where std::vector is defined 

std::vector<MyClass> arr(num, MyClass(10,20)); 

O num unsurların bir vektör oluşturur her eleman oluşturulur: Eğer ben kullanmak tavsiye std::vector, kullanıyormuş gibi

Ancak, o zaman varsayılan olmayan kurucu çağırmak bir vektör oluşturabilir MyClass(10,20)'u argüman olarak geçirerek sınıfın kopya-kurucusunu arayarak.

Vektör de iyidir, çünkü şimdi hafızayı kendiniz yönetmeniz gerekmez. Ne manuel tahsis ne de manuel ayrılma. Ayrıca, herhangi bir zamanda arr.size() numaralı telefonu arayarak öğe sayısını öğrenebilirsiniz. Vektörün kaç tane element içerdiğini her zaman bilirsiniz. , Ayrıca

f(arr[i]); // 0 <= i < arr.size(); 

sizi: dizini kullanarak, yani sadece erişim diziler gibi, öğeleri erişebilir

arr.push_back(MyClass(20,30)); 

Ve şimdi: Ayrıca tıpkı .push_back() üye işlevini çağırarak, zaman öğeleri ekleyebilirsiniz

#include <algorithm> //header file where std::for_each is defined 

std::for_each(arr.begin(), arr.end(), f); 

wher: siz <algorithm> başlığından çeşitli algoritmik işlevlerini kullanmayı sağlayan deyimsel programlamayı kolaylaştırmak yineleyiciler kullanabilirsiniz f, f'da yapmak istediğiniz şeye bağlı olarak MyClass& (veya MyClass const &) türünün bir bağımsız değişkenini alan işlevdir.

C++ 11, sen olarak lambda kullanabilirsiniz:

std::for_each(arr.begin(), arr.end(), [](const MyClass & m) 
             { 
              //working with m 
             }); 
+1

teşekkür ederiz! Aslında, vektörler yerine dizileri kullanan bir yaklaşım arıyordum çünkü öğretmenim sınıfın yerine dizileri kullanmasını istiyordu. Cevabını buldum. – user972276

+0

@ user972276: Diziler için, varsayılan olmayan yapıcıyı çağırmak istiyorsanız, ilk yaklaşımınız ne yapabiliyordur. Ancak, gelecekte, diziye ihtiyacınız varsa, * ilk * std :: vector' kullanmayı düşünün. Çok güzel özelliği ile harika bir kaptır. – Nawaz

6

C++ 0x bu dilbilgisi çalışır Yeni ifadede varsayılan olmayan kurucu çağırabilmesi:

MyClass *myVar; 
myVar = new MyClass[2]{{10, 20},{20, 30}}; 

Ancak, yalnızca çalışma zamanında kullanılabilen öğelerin sayısı olduğunda işe yaradığından şüpheliyim.Nawaz'ın cevabında gösterildiği gibi vektör yaklaşımı daha iyi olurdu.

2

Bunu geçmişte yaptığım bir yol, çift işaretçiyi kullanıyor. Tahmin edebileceğiniz hemen hemen herhangi bir kontrol yapısı ile

MyClass ** myvar; 
myvar = new Myclass*[num] 
for(int i = 0; i < 4; i++){ 
*(myvar+i) = new Myclass(i);} 

İşleri, sadece gerileme nesneler mutlaka öbek üzerinde ardışık olmayacak olmasıdır.

0

Aslında, bu işlemek için yeni bir yerleşim kullanabilirsiniz:

MyClass * myVar; 
myVar = reinterpret_cast<MyClass *>(new char[num * sizeof(MyClass)]); 
int i = 0; 
for (i = 0; i < num; i++) { 
    new(&myVar[i]) MyClass(0,0); 
} 
+0

Yeni char [] 'yerine' std :: align_storage' kullanmalısınız. –

+0

Ayrıca, bu hafızayı boşaltmak için, her bir nesnenin yıkıcılarını çağırmanız ve sonra 'delete [] reinterpret_cast (myVar); –

0

Bunu sen de şöyle yapabilirsiniz: yardımcı için

MyClass *myVar[num]; 

for(int i = 0; i < num; i += 1) 
{ 
    myVar[i] = new MyClass(0, 0); 
}