一般来说,在必要时使用指针是个好主意,但在可能的情况下使用引用或对象对象(想想值)。
首先您需要知道gVector3 是否满足标准容器的要求,即gVector3 类型是否可复制和可分配。如果gVector3 也是默认可构造的,这很有用(请参阅下面的更新说明)。
假设是这样,那么你有两个选择,将gVector3的对象直接存储在std::vector中
std::vector<gVector3> points;
points.push_back(gVector(1, 2, 3)); // std::vector will make a copy of passed object
或手动管理 gVector3 对象的创建(以及销毁)。
std::vector 点;
points.push_back(新 gVector3(1, 2, 3));
//...
当不再需要 points 数组时,请记住遍历所有元素并对其调用 delete 运算符。
现在,您可以选择是否可以将gVector3 作为对象来操作(您可以假设将它们视为值或值对象),因为(如果,请参阅上面的条件)由于复制构造函数和赋值运算符的可用性,以下操作是可能的:
gVector3 v1(1, 2, 3);
gVector3 v2;
v2 = v1; // assignment
gVector3 v3(v2); // copy construction
或者您可能想要或需要使用 new 运算符在 动态存储 中分配 gVector3 的对象。这意味着,您可能希望或需要自行管理这些对象的生命周期。
顺便说一句,你可能还想知道When should I use references, and when should I use pointers?
更新:这是对默认可构造性注释的解释。感谢 Neil 指出最初并不清楚。正如 Neil 正确注意到的那样,C++ 标准并不要求它,但是我指出了这个特性,因为它是一个重要且有用的特性。如果类型 T 不是默认可构造的,C++ 标准没有要求,那么用户应该注意我尝试在下面说明的潜在问题:
#include <vector>
struct T
{
int i;
T(int i) : i(i) {}
};
int main()
{
// Request vector of 10 elements
std::vector<T> v(10); // Compilation error about missing T::T() function/ctor
}