【问题标题】:Passing an object pointed to by an iterator by reference to a function C++通过引用函数 C++ 传递迭代器指向的对象
【发布时间】:2020-07-12 03:48:53
【问题描述】:

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

我需要能够通过指针传递或将 mystructs 的每个结构引用到 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);
}

【问题讨论】:

  • 离题但是...it != mystructs.begin() 应该是it != mystructs.end()。
  • @G.M.你是对的谢谢..纠正它

标签: c++ iterator parameter-passing pass-by-reference pass-by-pointer


【解决方案1】:

您的函数需要一个指针,使用&amp; 来获取某物的地址。

MyFunc(&*it);

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

替代方法(在 C++ 中可能更好)是将您的 MyFunc 函数转换为获取引用而不是指针。

【讨论】:

    【解决方案2】:

    在 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);
        }
    }
    

    【讨论】:

    • 或者我可以让我的函数接受一个 MY_STRUCT& ,然后通过 *it ...在这种情况下我仍然会通过引用获得通过吗?谢谢
    • 是的,你是对的。如果您将参数声明为PARAM&amp;,它将“自动”作为 C++ 中的引用传递。在函数调用中你看不到,if是直接传值还是直接引用,这在C++语法中我有点不喜欢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-27
    • 2021-06-04
    • 1970-01-01
    • 2018-09-17
    相关资源
    最近更新 更多