我刚开始学习C++中的指针,不太确定何时使用指针,何时使用实际对象。
例如,在我的一个作业中,我们必须构建一个gPolyline类,其中每个点由gVector定义。目前,我的gPolyline类变量如下:
private:
vector<gVector3*> points;
如果我使用 vector< gVector3 > points ,会有什么不同?此外,何时使用指针有一般的经验法则吗?谢谢!
我刚开始学习C++中的指针,不太确定何时使用指针,何时使用实际对象。
例如,在我的一个作业中,我们必须构建一个gPolyline类,其中每个点由gVector定义。目前,我的gPolyline类变量如下:
private:
vector<gVector3*> points;
vector<gVector3>
插入元素,将会复制这些元素,并且这些元素将不再连接到您插入的项。当您存储指针时,向量只是引用您插入的对象。gVector3
是否符合标准容器的要求,即类型 gVector3
是否可复制和可分配。如果 gVector3
也可以默认构造(请参见下面的更新说明),那么这将非常有用。std::vector
中存储 gVector3
对象。std::vector<gVector3> points;
points.push_back(gVector(1, 2, 3)); // std::vector will make a copy of passed object
或手动管理gVector3
对象的创建(和销毁)。
std::vector points; points.push_back(new gVector3(1, 2, 3)); //...
当不再需要points
数组时,请记得遍历所有元素并调用delete
运算符。
现在,您可以选择将gVector3
视为对象进行操作(可以将其视为值或值对象),因为(如果,见上面的条件)由于复制构造函数和赋值运算符的可用性,以下操作是可能的:
gVector3 v1(1, 2, 3);
gVector3 v2;
v2 = v1; // assignment
gVector3 v3(v2); // copy construction
或者您可能希望或需要使用 new 操作符在动态存储中分配 gVector3
对象。也就是说,您可能希望或需要自行管理这些对象的生命周期。
顺便说一下,您可能也想知道 何时应该使用引用,何时应该使用指针?
更新:以下是对 默认可构建性 注意事项的解释。感谢 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
}
在现代C++中,指针通常应该避免使用。如今指针的主要目的是因为指针可以是多态的,而显式对象则不行。
然而,当您需要多态性时,最好使用智能指针类,例如std::shared_ptr
(如果您的编译器支持C++0x扩展),std::tr1::shared_ptr
(如果您的编译器不支持C++0x但支持TR1)或boost::shared_ptr
。
STL_Struct<object>
迁移到STL_Struct<object *>
:)有时候,出于我在上面回答中澄清的原因,您确实需要指向对象而不是对象本身的指针...但我会承认通常没有必要使用指针。 - Mahmoud Al-Qudsishared_ptr
。最后,使用原始指针会破坏所有具有删除语义的标准算法,例如std::remove
、std::remove_if
、std::unique
、std::replace
、std::replace_if
等。 - Billy ONeal通常你使用对象。
吃一个苹果比吃一个插在棍子上的苹果容易(好吧,两米长的棍子因为我喜欢糖苹果)。
在这种情况下,只需将其设置为vector<gVector3>
如果你有一个vector<g3Vector*>,这意味着你正在动态分配新的g3Vector对象(使用new运算符)。如果是这样,那么你需要在某个时候调用delete来删除这些指针,而std::Vector并不设计做到这一点。
但每个规则都有例外。
如果g3Vector是一个成本很高的巨大对象(很难判断,请阅读你的文档),那么将其存储为指针可能更有效。但在这种情况下,我会使用boost::ptr_vector<g3Vector>,因为它可以自动管理对象的生命周期。