我得到了作业,我必须为多维向量写一个类
我被告知我必须使用模板,这对我来说是全新的,确切地说,我必须使用template <unsigned short n>
,其中n定义了我的矢量有多少维度。
vector.h
#include <vector>
template <unsigned short n>
class Vector {
public:
std::vector<float> coords;
Vector<n>();
};
vector.cpp
#include "vector.h"
Vector<n>() {
for(int i = 0; i < n; i++) {
coords.push_back(0.0);
}
};
我的默认构造函数使矢量线变为0.0
我在矢量上得到错误。 cpp C:\CodeBlocks\kool\praks3\vector.cpp|3|error: 'n' was not declared in this scope|
此外 ..为什么我必须在这里使用模板,我阅读模板教程,它用于优化代码并减少代码重复,但这里的n必须始终是unsigned short
当我看这个例子时,我明白我使用模板,因为我的数据类型可以是我想要的任何东西,我可以将它用于整数,双打或任何类型的数字
但是目前使用模板有什么意义,当我定义了必须使用的数据类型时???
template <class dataType>
dataType GetMin (dataType a, dataType b) {
return ((a < b) ? a : b );
}
如果有什么不清楚的地方,请随时向我询问! 因为我有很多困惑:)
答案 0 :(得分:2)
你可能被告知在这里使用模板不是因为这是正确的事情,但因为这样做应该有希望教你如何使用它们。具体而言,教师试图向您展示模板可以采用某些非类型参数。
您的问题虽然与模板关系不大,而且与不了解如何构建C ++类有关。在类中定义函数时,需要使用范围语法:
// non-templated vector
Vector::Vector()
{
...
}
那是问题1.问题2是你试图在cpp文件中定义模板功能。你不能这样做。您必须将函数定义放在标题中(减去几个案例,我会让您的老师稍后讨论)。
接下来您需要了解的是std::vector
已经有一个可以使用的质量初始化程序而不是for循环:
std::vector<float> my_vect(42, 0.0); // builds a vector with 42 floats all initialized to 0.0
使用这些线索,你应该能够解决你的家庭作业问题。
答案 1 :(得分:2)
您应该首先阅读模板:http://www.cplusplus.com/doc/tutorial/templates/
模板很不错,因为它们使您可以使用泛型类型。例如,使用相同的代码获取两个对象(int,long,float等)的最大值或最小值。在你的情况下,使用模板是个好主意,因为它可以让你拥有整数,浮点数,双精度或任何你喜欢的矢量。
另一方面,使用模板时最简单的方法是将标题和实现保留在同一个文件(标题)中。
您的构造函数Vector<n>();
未正确说明。因为您的类之前有template <unsigned short n>
,所以您在其中编写的所有内容都将使用该模板。
template <unsigned short n>
class Vector {
public:
// Here..
};
所以只需像通常那样编写构造函数。
答案 2 :(得分:1)
回答:使用模板有什么意义,当我定义了必须使用哪种数据类型时
你的班级没有任何意义,因为它是写的。我本来希望看到要存储的类型和(可能)大小作为模板参数。
template <class T, unsigned short n>
class MyVector {
...
}