如何根据循环获取范围内对象的地址?

时间:2016-11-22 01:04:24

标签: c++ c++11

我试图遍历我的向量并获取存储在向量中的项目的地址。它适用于其他类型的迭代器(见下文),但当我尝试为for(auto it :my_vec)执行此操作时,它会抛出错误error: no match for 'operator*' (operand type is 'my_class')

  #include <iostream>
  #include <vector>

  class my_class{
      int x;
  public: 
      my_class(int x_):x(x_){}

  };

 std::vector<my_class> my_vec;

 void fill_vec(size_t size){

     for(int i = 0; i < size; i++){
         my_vec.push_back(my_class(i));
     }

 }

 int main(){

     size_t size = 10;

     fill_vec(size);

     for(auto it :my_vec){
         std::cout << &it << std::endl;
         std::cout << &(*it) << std::endl;
     }

     std::cout << "-----------" << std::endl;

     for(auto it = my_vec.begin(); it != my_vec.end(); it++){
         std::cout << &(*it) << std::endl;
     }

     std::cout << "-----------" << std::endl;

     for(size_t i = 0; i < my_vec.size(); i++){
         std::cout << &my_vec[i] << std::endl;
     }   

 return 0;
 }

2 个答案:

答案 0 :(得分:3)

基于范围的for循环获取值,而不是迭代器。使用auto& it : myVec获取myVec中对象的引用。

答案 1 :(得分:3)

  

如何根据循环获取范围内对象的地址?

与获取其他地方的对象地址的方式相同:使用addressof运算符(operator&)。

  

它适用于其他类型的迭代器(见下文),但当我尝试为for(auto it :my_vec)执行此操作时,它会抛出错误error: no match for 'operator*' (operand type is 'my_class')

基于for循环的范围不会给你一个迭代器。它给你一个对象。在这种情况下,您使用了auto,因此它为您提供了my_class实例(因为恰好是容器的value_type),它是向量中对象的副本。 my_class(解除引用运算符)没有operator*重载,因此您尝试的行(包含*it)不起作用,编译器会为您描述问题。

因此,std::cout << &it << std::endl;是正确的,但它会为您提供副本的地址,而不是向量中的对象。由于您可能需要向量中对象的地址,因此您应该使用auto&my_class&来获取引用。当您使用引用作为addressof运算符的操作数时,您将获得引用对象的地址。