对象引用的向量

时间:2011-11-20 09:49:03

标签: c++

有一个对象引用的向量是否合法,如下所示?

vector<Agent&> seenAgents;

例如,某些但不是场景中的所有对象都填充了哪些?

我有一个Agent对象的向量,但上面列出的向量应仅包含对每个代理当前可以看到的对象的引用 - 这意味着将一直添加和删除引用。

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

我似乎在声明向量的行上收到此错误:

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

这是直接与线路有关还是最有可能发生在其他地方?它正在构造函数初始化列表中初始化,如下所示:

seenAgents(vector<Agents&>())

4 个答案:

答案 0 :(得分:19)

您不能拥有vector个引用,因为引用不是可复制 assignable和所有 STL容器应该存储 copyable < / strike>可分配项目。

但是你可以使容器保持指针。像这样:

vector< Agents* > seenAgents;

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

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

答案 1 :(得分:8)

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

Boost库提供PTR_VECTOR,这是一个比以下更好的解决方案:

vector<T*> foo;

答案 2 :(得分: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 )++;

我发现包装器的符号在代码可读性方面更为可取。我本身并不喜欢包装纸,但它会在以后支付股息。

答案 3 :(得分:0)

您可以在C ++ 11中改用std::reference_wrapper

  

std :: reference_wrapper是一个类模板,它将引用包装在可复制的可分配对象中。它通常用作一种将引用存储在标准容器(如std :: vector)中的机制,而标准容器通常无法保存引用。

示例:

#include <functional>
#include <vector>
#include <iostream>

int main(int argc, char *argv[])
{

  int a = 5;
  int b = 6;
  std::vector<std::reference_wrapper<const int>> v;
  v.push_back(a);
  v.push_back(b);

  for (const auto& vi: v)
  {
    std::cout << vi << std::endl;
  }
  return 0;
}

https://en.cppreference.com/w/cpp/utility/functional/reference_wrapper