在我当前的代码中,我想将新的DrawObjects插入到我创建的向量中,
的std ::矢量< DrawObject>对象;
有什么区别:
objects.push_back(DrawObject(name, surfaceFile, xPos, yPos, willMoveVar, animationNumber));
和
objects.push_back(new DrawObject(name, surfaceFile, xPos, yPos, willMoveVar, animationNumber));
答案 0 :(得分:16)
第一个添加非指针对象,而第二个添加指针到向量。所以这一切都取决于向量的声明,你应该做哪一个。
在您的情况下,由于您已将objects
声明为std::vector<DrawObject>
,因此第一个将起作用,因为objects
可以存储DrawObject
类型的项目,而不是{{ 1}}。
在C ++ 11中,您可以将DrawObject*
用作:
emplace_back
注意区别。将其与:
进行比较objects.emplace_back(name, surfaceFile, xPos, yPos,
willMoveVar, animationNumber);
使用objects.push_back(DrawObject(name, surfaceFile, xPos, yPos,
willMoveVar, animationNumber));
,您不在调用站点构造对象,而是将参数传递给vector,并且向量在内部构造对象。在某些情况下,这可能会更快。
阅读有关emplace_back的文档(强调我的),
将新元素追加到容器的末尾。该元素就地构建,即不执行复制或移动操作。使用提供给函数的完全相同的参数调用元素的构造函数。
由于它避免了复制或移动,因此生成的代码可能会更快一些。
答案 1 :(得分:1)
鉴于
std::vector< DrawObject > objects;
两个版本之间的区别在于第一个版本是正确的,第二个版本不是。
如果第二个版本编译,正如您在评论中指出的那样,它不会按预期执行。它还建议您考虑制作一些DrawObject
的构造函数explicit
。
答案 2 :(得分:1)
第二个版本希望objects
是DrawObject的指针的向量,而第一个版本希望objects
保持对象本身。因此,根据objects
的声明,只会编译其中一个版本。
如果以你的方式声明objects
,只有第一个版本会编译,如果你将对象声明为std::vector< DrawObject*> objects;
,那么只会编译第二个版本。
答案 3 :(得分:0)
使用关键字new
创建对象时,将其分配到堆上。这将返回指向对象的指针。
当您创建没有关键字new
的对象时,它将在堆栈上分配,您将可以访问该对象。