实现动态数组类模板,要求: 重载[]、<<运算符,实现普通构造函数、复制构造函数等; 重载[]运算符时要处理越界异常,并用智能指针避免内存泄露;
时间: 2023-09-05 18:04:58 浏览: 106
### 回答1:
以下是一个简单的动态数组类模板的实现,满足上述要求:
```cpp
#include <iostream>
#include <memory> // 使用智能指针需要包含该头文件
#include <cstdlib> // 使用 exit() 需要包含该头文件
template<typename T>
class DynamicArray {
public:
DynamicArray() : data(nullptr), size(0), capacity(0) {}
DynamicArray(int capacity) : data(std::make_unique<T[]>(capacity)), size(0), capacity(capacity) {}
DynamicArray(const DynamicArray& other) : data(std::make_unique<T[]>(other.capacity)), size(other.size), capacity(other.capacity) {
for (int i = 0; i < size; i++) {
data[i] = other.data[i];
}
}
~DynamicArray() {}
void push_back(const T& value) {
if (size == capacity) {
if (capacity == 0) {
capacity = 1;
} else {
capacity *= 2;
}
std::unique_ptr<T[]> new_data = std::make_unique<T[]>(capacity);
for (int i = 0; i < size; i++) {
new_data[i] = data[i];
}
data = std::move(new_data);
}
data[size++] = value;
}
T& operator[](int index) {
if (index < 0 || index >= size) {
std::cerr << "Index out of range!" << std::endl;
exit(1);
}
return data[index];
}
friend std::ostream& operator<<(std::ostream& os, const DynamicArray& arr) {
os << "[";
for (int i = 0; i < arr.size; i++) {
os << arr.data[i];
if (i != arr.size - 1) {
os << ", ";
}
}
os << "]";
return os;
}
private:
std::unique_ptr<T[]> data;
int size;
int capacity;
};
```
上述实现中,使用了 `std::unique_ptr` 来管理动态数组的内存,避免了内存泄漏的问题。在重载 `[]` 运算符时,也对越界的情况进行了处理,避免了程序崩溃。
此外,还实现了普通构造函数、复制构造函数以及 `push_back()` 方法,可以方便地创建和修改动态数组。最后,重载了 `<<` 运算符,可以直接输出动态数组的内容。
### 回答2:
动态数组类模板的实现需要实现重载[]、<<运算符,并且要求处理越界异常,并使用智能指针来避免内存泄漏。
首先,定义一个类模板DynamicArray,用于表示动态数组:
```
template<typename T>
class DynamicArray {
private:
T* data; // 存储数组元素的指针
int capacity; // 数组容量
int size; // 数组当前大小
public:
// 普通构造函数
DynamicArray() {
data = nullptr;
capacity = 0;
size = 0;
}
// 复制构造函数
DynamicArray(const DynamicArray& other) {
capacity = other.capacity;
size = other.size;
data = new T[capacity];
std::memcpy(data, other.data, sizeof(T) * size);
}
// 重载[]运算符
T& operator[](int index) {
if (index < 0 || index >= size) {
throw std::out_of_range("Index out of range.");
}
return data[index];
}
// 重载<<运算符
friend std::ostream& operator<<(std::ostream& os, const DynamicArray& arr) {
for (int i = 0; i < arr.size; i++) {
os << arr.data[i] << " ";
}
return os;
}
};
```
在上述代码中,我们使用了智能指针来管理动态分配的数组内存,避免了内存泄漏的问题。此外,我们还实现了检查越界的操作,当访问越界时会抛出异常。
使用该类模板的示例代码如下:
```
int main() {
DynamicArray<int> arr;
arr = DynamicArray<int>(5);
for (int i = 0; i < 5; i++) {
arr[i] = i;
}
std::cout << arr << std::endl;
DynamicArray<int> arr2 = arr;
std::cout << arr2 << std::endl;
try {
int value = arr2[10]; // 越界访问,会抛出异常
} catch(const std::exception& e) {
std::cout << "Exception: " << e.what() << std::endl;
}
return 0;
}
```
上述示例代码中,我们创建了一个DynamicArray对象arr,并使用赋值构造函数创建了另一个DynamicArray对象arr2,然后通过重载的[]运算符和<<运算符分别进行了访问和输出操作。在访问时,如果发生越界,会抛出异常,我们通过try-catch语句捕获异常并输出异常信息。
这样,我们就实现了一个动态数组类模板,并且在其中重载了[]、<<运算符,实现了普通构造函数、复制构造函数,并处理了越界异常,并使用智能指针避免了内存泄漏。
### 回答3:
动态数组类模板可以通过使用智能指针来避免内存泄露,并实现重载[]和<<运算符。首先,在类模板中定义智能指针和数组大小。
```cpp
#include <memory>
using namespace std;
template <typename T>
class DynamicArray {
private:
shared_ptr<T[]> arr;
int size;
public:
// 默认构造函数
DynamicArray() {
size = 0;
arr = nullptr;
}
// 普通构造函数
DynamicArray(int _size) {
size = _size;
arr = make_shared<T[]>(size);
}
// 复制构造函数
DynamicArray(const DynamicArray<T>& other) {
size = other.size;
arr = make_shared<T[]>(size);
for (int i = 0; i < size; i++) {
arr[i] = other.arr[i];
}
}
// 重载[]运算符
T& operator[](int index) {
if (index < 0 || index >= size) {
throw out_of_range("数组越界!");
}
return arr[index];
}
// 重载<<运算符
friend ostream& operator<<(ostream& os, const DynamicArray<T>& obj) {
for (int i = 0; i < obj.size; i++) {
os << obj.arr[i] << " ";
}
return os;
}
};
```
在上述代码中,使用了`shared_ptr`来管理内存,以避免内存泄露。在默认构造函数中,数组大小设置为0并将智能指针设置为`nullptr`。在普通构造函数中,通过`make_shared`函数创建一个指定大小的数组。在复制构造函数中,首先将数组大小和智能指针赋值给新对象,然后逐个复制元素值。
重载[]运算符时,通过检查索引是否越界,如果越界则抛出`out_of_range`异常,并返回对应索引处的元素值。
重载<<运算符时,遍历数组并将元素值输出到流中。
这样,就实现了一个可以处理越界异常并且用智能指针避免内存泄露的动态数组类模板。
阅读全文