自定义向量类。具体要求如下。 (1) 向量的维数可缩放; (2) 对象构造、析构、赋值相关的四大函数;(每个同学必须会写) (3) 其他成员函数(如:返回维数等)名字叫MyVector,添加运算符重载和异常处理
时间: 2024-10-09 16:10:22 浏览: 36
OpenGL ES着色器使用详解(二)
自定义一个可缩放向量类(如动态大小数组),我们可以设计如下:
```cpp
#include <iostream>
#include <vector>
using namespace std;
class MyVector {
private:
vector<double> elements; // 存储向量元素
int dimension; // 当前维度
public:
// 构造函数,初始化向量为空,维数为0
MyVector() : dimension(0) {}
// 析构函数,释放内存
~MyVector() {
elements.clear();
}
// 可变尺寸构造函数,根据给定的维度和初始值创建向量
MyVector(int size, double initial_value = 0.0) {
if (size > 0) {
for (int i = 0; i < size; ++i)
elements.push_back(initial_value);
dimension = size;
} else {
throw invalid_argument("Dimension must be a positive integer.");
}
}
// 赋值操作,将另一个向量的内容复制到当前向量
MyVector& operator=(const MyVector &other) {
if (this != &other) {
elements = other.elements;
dimension = other.dimension;
}
return *this;
}
// 返回当前向量的维数
int getDimension() const {
return dimension;
}
// 添加一个元素到向量末尾,自动调整维度
void addElement(double value) {
elements.resize(dimension + 1); // 扩展vector
elements[dimension] = value;
dimension++;
}
// 运算符重载,用于向量相加
MyVector operator+(const MyVector &other) {
if (getDimension() == other.getDimension()) {
MyVector result(*this);
for (int i = 0; i < dimension; ++i) {
result.elements[i] += other.elements[i];
}
return result;
} else {
throw runtime_error("Vectors must have the same dimensions to perform addition.");
}
}
// 异常处理示例:如果除数为零,抛出异常
void divideBy(double divisor) {
if (divisor == 0) {
throw runtime_error("Cannot divide by zero.");
}
// 实现除法操作...
}
// 以字符串形式打印向量内容
friend ostream& operator<<(ostream& os, const MyVector& v) {
os << "[";
for (int i = 0; i < v.getDimension(); ++i) {
os << v.elements[i] << " ";
}
os << "]";
return os;
}
};
int main() {
try {
MyVector v1(3, 1.0);
MyVector v2(4, 2.0);
cout << "v1: " << v1 << endl;
cout << "v2: " << v2 << endl;
v1.addElement(3.5);
cout << "v1 after adding: " << v1 << endl;
v1 = v2;
cout << "v1 after assignment: " << v1 << endl;
v1.divideBy(2.0); // 此处不会抛出异常,因为预先检查了除数
} catch (const exception& e) {
cerr << "Caught exception: " << e.what() << endl;
}
return 0;
}
```
在这个例子中,我们实现了向量的构造、析构、赋值和一些基本操作,包括返回维数、添加元素和运算符重载。同时,还包含了一些异常处理的简单示例。
阅读全文