PDA

Tam Sürümünü Görmek İçin : Borland C++ Builder Dinamik Dizi Yardım!!


sımone
19/04/2005, 09:46
Arkadaşlar Borland C++ Builder da bir object dizisi yapmak istiyorum ve bunun boyutunu run-time da belirlemek istiyorum. Şöyle yaptığımda hata veriyor

int k =50;
TImage* resimler;
resimler =new TImage[k];

Hata: E2248 Cannot find default constructor to initialize array element of type 'TImage'


Ama aynı işlemi bir double tipi üzerinde yaptığımda hata vermiyor. Yardımcı olursanız sevinirim.


acehreli
19/04/2005, 21:13
O hatanin Turkcesi su: TImage'in varsayilan kurucusu yok.

new[] isleci her bir nesneyi varsayilan kurucusu (default constructor) ile kurar. Onun icin, varsayilan kurucusu olmayan tUrleri new[] ile kullanamazsin. (Aslinda vector, list, vs. ile de kullanamazsin.)

Yapabilecegin bir sey, TImage yerine TImage* kullanmak olabilir:


TImage ** resimler = new TImage*[k];


Ondan sonra,


resimler[0] = new TASImage(/* ... */);
resimler[1] = new TAttImage(/* ... */);
// vs.


Ama bu yontem yalin isaretciler kullandigi icin, olasi bir hata (exception) atildiginda kaynak kaybina yol acar. Ayrica, vector dururken new[] kullanmaya da hemen hemen hicbir zaman gerek olmaz.

Cok daha iyi bir cozum su olabilir:



#include <boost/shared_ptr.hpp> // boost.org'dan indirin

/* ... */

typedef boost::shared_ptr<TImage> TImageIsaretci;
typedef std::vector<TImageIsaretci> TImageToplulugu;

/* ... */

TImageToplulugu imageToplulugu;

for (int i = 0; i != toplamTImage; ++i)
{
imageToplulugu.push_back(TImageIsaretci(new TAttImage(/* ... */)));
}

/* ... */

imageToplulugu[0]->DrawBox(/* ... */);


Super! Ne delete[] yapmak gerekecek ne baska bir sey. Kaynak sizintisi filan yok...

Gercekten, std::vector varken new[] kullanmaya gerek yok.

Ali

sımone
20/04/2005, 17:55
teşekkürler