expand() 方法有問題。
#include <iostream>
struct obj
{
int fInt;
float fFloat;
};
template <typename T>
class dynamicArray {
private:
T* myArray;
int elements;
int size;
public:
dynamicArray();
void add(T dane);
void expand();
void init(int el);
T get(int index);
};
template <typename T>
dynamicArray<T>::dynamicArray()
{
this->size = 1;
this->elements = 0;
this->myArray = new T[this->size];
init(this->elements);
}
template <typename T>
T dynamicArray<T>::get(int index)
{
return this->myArray[index];
}
template <typename T>
void dynamicArray<T>::init(int el)
{
for (size_t i = el; i < this->size; i )
{
this->myArray[this->elements] = nullptr;
}
}
template <typename T>
void dynamicArray<T>::expand()
{
this->size *= 2;
T* tempArr = new T[this->size];
for (int i = 0; i < this->elements; i )
{
tempArr[i] = this->myArray[i];
//tempArr[i] = new T(*this->myArray[i]);
}
for (int i = 0; i < this->elements; i )
{
delete this->myArray[i];
}
delete this->myArray;
this->myArray = tempArr;
init(this->elements);
}
template <typename T>
void dynamicArray<T>::add(T dane)
{
if (this->size == this->elements)
this->expand();
this->myArray[this->elements] = dane;
this->elements ;
}
int main()
{
dynamicArray<obj*>* arr = new dynamicArray<obj*>();
obj* so = new obj;
so->fInt = 2;
so->fFloat = 2;
arr->add(so);
obj* so2 = new obj;
so2->fInt = 3;
so2->fFloat = 3;
arr->add(so2);
so = arr->get(0);
so2 = arr->get(1);
std::cout << so->fInt << std::endl;
std::cout << so->fInt;
}
在這個 for 回圈中,我想分配給 myArray 的臨時陣列元素,但它們不是副本
for (int i = 0; i < this->elements; i )
{
tempArr[i] = this->myArray[i];
//tempArr[i] = new T(*this->myArray[i]);
}
當我洗掉它們時,它們也會從 tempArr 中消失。
for (int i = 0; i < this->elements; i )
{
delete this->myArray[i];
}
我嘗試了幾件事,但找不到解決方案。
tempArr[i] = new T(*this->myArray[i]);
我不確定這是否是正確的軌道,但它給了我一個
“初始化”:無法從“obj”轉換為“T”
和
'=' 不能從 'T*' 轉換為 'T'
uj5u.com熱心網友回復:
您讓自己感到困惑,您有一個指向 陣列的T指標,而不是指向 陣列的指標T*,但是您的某些代碼的撰寫方式就好像您擁有后者一樣。
這(在expand)
for (int i = 0; i < this->elements; i )
{
delete this->myArray[i];
}
delete this->myArray;
應該只是
delete[] this->myArray;
您不能洗掉單個陣列元素,因為它們不是(必然)指標。并將delete[] this->myArray;為陣列中的所有元素呼叫解構式。
并且init可以簡單地洗掉,因為它再次假定您的陣列元素是指標。
嘗試用 撰寫一些代碼dynamicArray<int>,這樣你T的絕對不是指標。這將找到您錯誤地認為T是指標的所有地方(以防我錯過了任何地方)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/531007.html
標籤:C 数组动态数组
上一篇:字串被垃圾填滿
