Я хочу реализовать численный Vector
, который имеет несколько числовых операций.Реализация универсального векторного класса
Я использовал шаблон для определения родовой версии вектора.
Но реализация должна отличаться от конкретной реализации, например, Vector3
.
Например, +
Операция будет выглядеть так.
Vector3 реализация
Vector3 operator+(const Vector3& vec3) const{
return Vector3(data[0]+vec3.data[0], data[1]+vec3.data[1], data[2]+vec3.data[2]);
}
реализация шаблона
GenericVector operator+(const GenericVector<T,N>& vec) const{
GenericVector temp = *this;
for(int i=0;i<N;i++)
{
temp.data[i] += vec.data[i];
}
return temp;
}
Теперь, когда мы не можем знать, сколько data
это было бы, мы не можем определить конструктор как Vector3(x,y,z)
. Вот почему я представил для цикла в + operator
перегрузке.
Фактически, когда дело доходит до появления кодов, реализация Vector3
выглядит лучше. Но его нельзя масштабировать для разных векторов размеров.
Реализация шаблона выглядит менее приятнее, чем у Vector3
. Но версия шаблона может легко масштабироваться до многих векторов размеров, делая это.
typedef GenericVector<double, 3> Vector3d;
typedef GenericVector<double, 6> Vector6d;
Я не привык к шаблону C++. Есть ли кто-нибудь, кто может указать проблему моей реализации или понимания?
Мой вопрос заключается в том, что в реализации + operator
в шаблоне версии, является выбором введения для петли для размещения неизвестных целого N
права или единственного выбор?
Для простой один вопрос,
Могу ли я избежать цикл в + operator
?
Это часть моих кодов.
template <typename T, int N>
class GenericVector{
protected:
T data[N];
public:
GenericVector()
{
for(int i=0;i<N;i++)
{
data[i] = static_cast<T>(0);
}
}
GenericVector operator+(const GenericVector<T,N>& vec) const{
GenericVector temp = *this;
for(int i=0;i<N;i++)
{
temp.data[i] += vec.data[i];
}
return temp;
}
//...
};
Итак, в чем вопрос? Разве это не работает или вы спрашиваете, правильно ли это сделать? – NathanOliver
Вам не нужно инициализировать 'data' до' 0' в цикле. Все, что вам нужно, это 'GenericVector(): data() {}'. И вам не нужны параметры шаблона в параметре 'operator +'. Это будет делать: 'GenericVector operator + (const GenericVector & vec) const'. Кроме этого, все выглядит нормально. Но я понятия не имею, о чем вы спрашиваете. – juanchopanza
Кроме того, вам, вероятно, следует реализовать «GenericVector & operator + = (const GenericVector &)» и использовать его в 'operator +'. – juanchopanza