【发布时间】:2019-02-11 16:34:05
【问题描述】:
假设我正在尝试实现一些数学向量类。
由于向量接口将在多个地方使用:基于数组的向量,矩阵返回列和行作为向量接口对象等。
我想为我的向量重载 +,- 运算符。每个运算符都应返回某个向量实现类的新构造对象。
但正如您所知,运算符重载应该返回一个值或一个引用。我无法返回值,因为我需要运行时多态性,所以我留下了引用。但是要有一个在函数调用对象之后不会死掉的引用应该在堆中创建。
那么我应该如何处理这种情况呢?
附:我可以创建一个 shared_ptr 并返回对包含值的引用,但这看起来不是一个好习惯。
typedef unsigned int vector_idx_t;
template <class T, vector_idx_t size>
class vector {
public:
virtual ~vector();
virtual T& operator[](const vector_idx_t idx) = 0;
virtual vector<T, size>& operator+ (const T& a) const = 0;
virtual vector<T, size>& operator- (const T& a) const = 0;
virtual vector<T, size>& operator* (const T& a) const = 0;
virtual vector<T, size>& operator/ (const T& a) const = 0;
virtual vector<T, size>& operator+ (const vector<T, size>& vec2) const = 0;
virtual vector<T, size>& operator- (const vector<T, size>& vec2) const = 0;
};
template <class T, vector_idx_t size>
class array_vector: public vector<T, size> {
private:
std::array<T, size> m_elements;
public:
array_vector();
array_vector(std::array<T, size> elements);
array_vector(const vector<T, size>& vec2);
array_vector(std::initializer_list<T> elems);
virtual ~array_vector();
virtual T& operator[](const vector_idx_t idx) {
return m_elements[idx];
}
virtual vector<T, size>& operator+ (const T& a) const {
std::array<T, size> e;
for (vector_idx_t i = 0; i < size; ++i) {
e[i] = m_elements[i] + a;
}
auto v = std::make_shared<array_vector<T, size>>(elems);
return *v;
}
};
【问题讨论】:
-
老实说,我认为不需要多种向量。一个向量是一个向量是一个向量。这似乎是您的需求、分析或设计存在问题。
-
我可以有一个矩阵类,其中包含方法:getRow、getColumn。矩阵行和列应该是矩阵数据访问的向量代理。我不需要高性能计算,因为如果需要我可以在汇编中完成。问题是:用 C++ 代码表达我的想法的“正确”方式。
-
我不明白你的要求,假设你想要一个特殊的类
matrix_row_proxy<T>扩展你的vector<T>,这应该是你代理矩阵访问所需要的。它的operator+应该返回哪种新对象?为什么您甚至需要多个此类运算符的实现? -
我同意你的模型有缺陷的人群。解决问题的一种方法是将 unique_ptr 或 shared_ptr 返回到您分配的返回对象?然后客户端代码完全处理智能指针。
标签: c++11 polymorphism operator-overloading run-time-polymorphism