Ben dinamik bir dizi uygulamaya çalışıyorum: Böyle kullanıldığında, beklendiği işleri gibiİki Boyutlu Dizi kullanarak şablonlar
template <typename Item>
class Array {
private:
Item *_array;
int _size;
public:
Array();
Array(int size);
Item& operator[](int index);
};
template <typename Item>
Array<Item>::Array() {
Array(5);
}
template <typename Item>
Array<Item>::Array(int size) {
_size = size;
_array = new Item [size];
for (int i = 0; i < size; i++)
cout << i << " " << _array[i] << " " << &_array[i] << endl;
}
template <class Item>
Item& Array<Item>::operator[](int index) {
if (index < 0 || index > _size-1)
cout << "this: " << this << ". Index out of range" << endl;
return _array[index];
}
yani baskılar 5
: Ancak
Array<int> testArray(5);
testArray[0] = 5;
cout << testArray[0] << endl;
, isterim İki boyutlu bir dinamik dizi için sınıf kullanmayı sever. Ben şu sihirli bir çalışma ve baskı 5 ...
Array< Array<int> > testArray(5);
testArray[0][0] = 5;
cout << testArray[0][0] << endl;
... ama çalışmıyor düşündüm. [0] [0] 'da değeri ayarlamaya çalıştığımda çöküyor. Hata ayıklayıcı, this
'un _size
'un 0 ve _array
'a NULL
olarak ayarlandığını gösterir. Bu noktada this
, son oluşturulan Array örneğinin _array
öğesinin ilk öğesini işaret eder.
"İç" dizinin yapıcısını çağırması, elde edemediğim şeylerden biri. Kodun içine adım attığımda, Array(int size)
'un bir kez ve Array()
beş kez çağrıldığını görüyorum. İç diziyi belirli bir boyutta oluşturmak istiyorum, ancak Array< Array<int>(10) > testArray(5)
'u kullanarak derleme yapmıyor.
Bu konuda bana biraz bilgi verebilir misiniz? Görünüşe göre kafamı henüz şablonların etrafına dolamıyordum ...
Oh, Kurucu aramalarını zincirleyemediğini bilmiyordum! Şimdi özel bir işlev oluşturdum ve şimdi çalışıyor, ancak yalnızca varsayılan kurucuda belirtilen boyutta çalışıyor. İçsel diziyi dinamik boyutta oluşturma hakkında herhangi bir fikir var mı? – fabian789
C++ 11 ** ve ** kullanıyorsanız, dış dizi boyutu statik olarak bilinir, tüm iç diziler için başlatıcılar sağlamak üzere bir başlatıcı listesi kullanabilirsiniz. Her neyse, cevabımda bunu yazmayı unuttum, ama bu bir egzersizden başka bir şey olmadıkça, gerçek çözüm 'std :: vector' kullanmaktır. –
Evet, sadece bir alıştırma. "Başlatıcı listesi" ile ne demek istediğini söyler misin? '_array = new Item [size] kullanarak (boyut);' benim için derleme yapmıyor. – fabian789