我是C ++ noob程序员......(我通常使用Java)现在我遇到了指针,引用和向量方面的一些问题......
我需要从Object
中提取vector<Object> objects
并且为了简单起见,我想将他的引用存储在另一个对象中,因为我需要编辑其中的一些参数次
这是我到目前为止编写的代码:
Object myObject = getMyObject(id, objects);
和getMyObject
只是实现for
周期,找到右object
的权利id
,然后返回return objects[i]
但如果我理解正确,这个方法会复制对象!所以,在myObject
中有一个完全不同的Object
,是不是?
我该怎么办?
非常感谢!
答案 0 :(得分:3)
是的,您需要使用指针或引用,否则您显示的行将调用Object
的复制构造函数。
您可以getMyObject
返回Object*
,然后您有一个指向该对象的指针,您可以将其指定给另一个Object*
。
或者,将myObject
定义为参考:Object& myObject
。
无论如何,您必须确保您返回的对象是动态分配的,而不是getMyObject()
中的本地变量,否则您将获得访问冲突。
您还必须确保释放对象以防止内存泄漏。
答案 1 :(得分:2)
如果您不想复制该对象,则需要一个引用或指针。这个问题是引用或指针很容易变得无效。如果您不希望这种情况发生,那么您应该在向量中存储指针。特别针对这种情况,您很可能需要shared_ptr。
std::shared_ptr<Object> getMyObject(foo id,
const std::vector<std::shared_ptr<Object>> & objects)
{
// ... find object
...
return objects[i];
}
...
std::vector<std::shared_ptr<Object>> objects;
objects.emplace_back(new Object(parameters));
...
std::shared_ptr<Object> x = getMyObject(id, objects);
答案 2 :(得分:1)
Object & getMyObject(int id, std::vector<Object> & objects)
{
// ... find ...
return objects[i];
}
然后将其绑定到用户代码中的另一个引用:
Object & theobject = getMyObject(12, all_objects);
现在您可以通过引用theobject
直接修改包含的元素。
如果您不想/需要修改对象,只需检查它们,您应该制作引用(以及容器)const
:
Object const & getMyObject(int id, std::vector<Object> const & objects);
答案 3 :(得分:1)
请记住,除非另有说明,否则STL始终会复制。但是,vector的at()和operator []都返回一个引用。
你需要
Object& myObject = objects.at(id);
如果要更改集合内的对象。
Object myObject = objects.at(id);
会给你一份副本。
答案 4 :(得分:0)
存储指向容器中原始对象的指针。
Object* obj1 = new Object();
Object* obj2 = new Object();
vector<Object*> myVector;
myVector.push_back(obj1);
myVector.push_back(obj2);
Object* tmpObj = myVector.at(0);