代码之家  ›  专栏  ›  技术社区  ›  Engineer999

通过引用函数C++传递迭代器指向的对象

  •  1
  • Engineer999  · 技术社区  · 6 年前

    我认为我理解迭代器和寻址等,但显然不是。请参阅下面的代码,这纯粹是一个示例。

    我需要能够通过指针传递或引用 我的誓言 MyFunc() 。函数应该能够更新传递的实际结构,而不是通过副本或值。

    我收到编译器错误:

    error: cannot convert 'MY_STRUCT' to 'MY_STRUCT*' for argument '1' to 'void MyFunc(MY_STRUCT*)'

    如果我只是传递迭代器地址,这也不起作用。

    正确的方法是什么。提前谢谢。

    typedef struct
    {
       int var1;
       int var2;
       std::string name;
    
    }MY_STRUCT;
    
    std::list<MY_STRUCT> mystructs;
    
    void MyFunc(MY_STRUCT*)
    {
        // Do something
    }
    
    
    // populate the list with structs etc.. not included here
    //.....
    
    
    for (std::list<MY_STRUCT>::iterator it = mystructs.begin();it != mystructs.end(); ++it)
    {
         MyFunc(*it);
    }
    
    1 回复  |  直到 6 年前
        1
  •  2
  •   RoQuOTriX    6 年前

    在C++中传递引用是用:

    void MyFunc(MY_STRUCT&)
    {
        // Do something
    }
    

    因此,您的调用是正确的,您当前想要的是传递指针,您可以通过解引用迭代器(通过传递解引用对象的地址)来实现:

    void MyFunc(MY_STRUCT*)
    {
        // Do something
    }
    
    
    // populate the list with structs etc.. not included here
    //.....
    int main() {
    
        for (std::list<MY_STRUCT>::iterator it = mystructs.begin();it != mystructs.begin(); ++it)
        {
             MyFunc(&*it);
        }
    }
    
        2
  •  0
  •   john    6 年前

    您的函数需要一个指针,请使用 & 为了得到某物的地址。

    MyFunc(&*it);
    

    *it 返回对 MY_STRUCT 对象,你需要使用 & 将该引用转换为指针。这很正常,使用迭代器这一事实根本没有区别。

    另一种选择(在C++中可能更好)是转换 MyFunc 函数获取引用而不是指针。