fab*_*789 6 c++ templates dynamic-arrays
我正在尝试实现一个动态数组:
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];
}
Run Code Online (Sandbox Code Playgroud)
当像这样使用时,它按预期工作,即打印5:
Array< int > testArray(5);
testArray[0] = 5;
cout << testArray[0] << endl;
Run Code Online (Sandbox Code Playgroud)
但是,我想将该类用于二维动态数组.我认为以下只会神奇地工作并打印5 ...
Array< Array<int> > testArray(5);
testArray[0][0] = 5;
cout << testArray[0][0] << endl;
Run Code Online (Sandbox Code Playgroud)
......但它不起作用.当我尝试将值设置为[0] [0]时,它会崩溃.调试器显示我this已经_size设置为0,并_array以NULL.this此时指向_array最后创建的Array实例的第一个元素.
我没有得到的一件事是"内部"数组调用它的构造函数.单步执行代码,我看到它Array(int size)被调用一次和Array()五次.我想创建具有特定大小的内部数组,但使用Array< Array<int>(10) > testArray(5)不编译.
你能否就此提供一些见解?看来我还不能完全绕过模板......
您不能在C++中链接构造函数调用.您的第一个构造函数实现不执行任何操作,因此父级中包含的5个实例Array最终未初始化,从而导致未定义的行为.
要修复,您可以size向另一个构造函数的参数添加默认值,或者在单独的(私有)函数中分解初始化逻辑,并从两个构造函数中调用它.
编辑:第一个构造函数什么都不做的原因是该行
Array(5)
Run Code Online (Sandbox Code Playgroud)
不调用当前实例的构造函数,而是分配一个新的(未命名的)临时Array实例,该实例在该行的末尾立即被销毁.
| 归档时间: |
|
| 查看次数: |
3198 次 |
| 最近记录: |