2011-11-20 47 views
12

拥有对象引用的向量是否合法?对象引用的向量

vector<Agent&> seenAgents; 

哪个例子可以由场景中的一些对象而不是所有对象填充?

我有代理对象的载体,但上述载体应坚持只有那些每个代理目前可以看到的引用 - 这意味着将要添加的引用并删除所有的时间。

这是语言允许的东西吗?此外,还有什么我需要注意的?如果我从矢量中删除引用,它会在任何地方持续吗?这是内存泄漏吗?

我似乎就行宣布矢量已经意识到了这个错误:

error C2528: 'pointer' : pointer to reference is illegal 

这是不是直接做线路或最有可能发生在其他地方?它被初始化在构造函数初始化器列表如下:

seenAgents(vector<Agents&>()) 
+0

重复的http://stackoverflow.com/questions/922360/why-cant-i-make-a-vector-of-references –

回答

19

你不能引用vector,作为参考并不 可复制 分配和所有 STL容器都应该存储 可复制 分配项目。

但是你可以让容器容纳指针。像这样:

vector< Agents* > seenAgents; 

这有点危险。您需要确定这些指针将保持有效。我的意思是 - 如果某人删除了一个对象,并由该容器中的指针指向,则指针将变为无效。您需要确保这不会发生,因为您无法检查它(您无法检查NULL,因为如果某人删除了尖锐的对象,指针将不会变为NULL)。

这里最好的解决方案(由带有指针的容器提供)将使用一些智能指针 - 例如一些引用计数;他们会保证你的对象将存在,并且指针是有效的。如果智能指针指向的对象被破坏,您可以检查它是否为NULL

+2

你确定引用不可复制吗?我会认为他们是不可转让的。 – UncleBens

+0

对,谢谢。但是你仍然不能“复制”一个引用,因为它不是一个真正的类型,它不是真的存在,我的意思是 - 没有为它分配momory(在大多数编译器实现中,很确定 - 所有这些)。但仍然 - 是的,'assignable'听起来更正确,更不容易混淆。编辑:) –

+0

你也不能默认构建它们。 –

8

你不能这样做。使用指针。

Boost库提供PTR_VECTOR比一个更好的解决方案:

vector<T*> foo; 
+2

为什么'ptr_vector'更好,然后'矢量'。当你说有些东西比较好时,其他东西就会描述你的指标。 – tomas789

+1

“ptr_vector”更好的原因有很多,你可以在这里阅读(http://www.boost.org/doc/libs/1_55_0/libs/ptr_container/doc/examples.html)。但是,简而言之,它们更像是一个引用向量,因此通常更安全。例如,您不要自己对指针进行取消引用,也不能在向量中存储“NULL”指针。 – edam

+1

Ooops,我的意思是说“你不能在向量中存储'NULL'指针* *默认*! – edam

2

我想类似的功能。最后,这里是我所做的:

template <class T> class VectorOfRefs : public std::vector<T *> { 
public: 
    inline T & at(const uint64_t i) { 
     T * x = std::vector<T *>::at(i); 
     return *x; 
    } 
}; 

VectorOfRefs <MyType> myVector; 
myVector.push_back(&myInstance0); 
myVector.push_back(&myInstance1); 

// later in the code: 
myVector.at(i).myMethod(); 

很明显,这是一个向下的指针的封面。

通常我会用STL和定居myVector.at(i)->myMethod(),但我想用++运算符,所以我有以下两种选择:

// using STL: 
(*myVector.at(i))++; 

// or, using my wrapper: 
myVector.at(i)++; 

我发现包装远远优于而言符号的代码可读性。我本人并不喜欢这个包装,但它稍后会派发股息。