Передача объекта, на который указывает итератор, по ссылке на функцию C ++ - PullRequest
2 голосов
/ 31 марта 2020

Я думал, что понял итераторы и обратился к et c. но очевидно нет. Посмотрите мой код ниже, который является просто примером.

Мне нужно иметь возможность передавать по указателю или ссылаться на каждую структуру от mystructs до MyFun c () . Функция должна иметь возможность обновлять фактическую переданную структуру, а не путем копирования или значения.

Я получаю ошибку компилятора:

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

Ответы [ 3 ]

2 голосов
/ 31 марта 2020

Передача по ссылке в 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);
    }
}
0 голосов
/ 31 марта 2020

Что ж, если у вас есть выбор, используйте ссылку для модификации следующим образом:

void MyFunc( MY_STRUCT& s )
{
    // modify the object here
}

Если вы не модифицируете объект, тогда передайте его как константную ссылку следующим образом:

void MyFunc( const MY_STRUCT& s )
{
    // read the object; cannot modify here
}

В обоих случаях вызов будет таким же, как вы его уже используете.

0 голосов
/ 31 марта 2020

Ваша функция требует указателя, используйте & для получения адреса чего-либо.

MyFunc(&*it);

*it возвращает ссылку на объект MY_STRUCT, вам нужно использовать & для преобразовать эту ссылку в указатель. Это нормально, тот факт, что вы используете итераторы, не имеет никакого значения.

Альтернативой (может быть, лучше в C ++) будет преобразование вашей MyFunc функции в указатель вместо ссылки.

...