Передача структур и членов структуры в функции

При передаче структур в функции, как будет выглядеть прототип / заголовок? Как они будут выглядеть при передаче членов структур в функции?

Например…

struct a_struct{
int a;
int b;
};

a_struct point;

void f1(a_struct)
void f2(a_struct)

И скажем, я хочу передать всю структуру на f1, а просто член на f2. Буду ли я использовать тип данных a_struct в качестве параметра для обоих? Или f2 будет иметь другой тип данных, потому что я передаю только член, который является int. Будет ли это меняться для массива структур? Программа, которую мне было поручено написать, должна использовать массивы структур. Я полагал, что это не будет иметь большого значения, за исключением того, что оно будет передано по ссылке автоматически.

1

Решение

При передаче объектов (не только скалярных значений) вы должны заботиться о владении памятью, копировании и т. Д. Это означает, что у вас есть несколько вариантов того, как вы объявляете интерфейс для своей функции. Например, вы можете передать по ссылке или передать по значению.

Возможная декларация для вас может быть:

void f1(a_struct& my_struct);

Это передаст ссылку на объект a_struct и предотвратит любое копирование объекта. Тем не менее, ваш пример структуры просто содержит скалярные значения, поэтому возможность копирования объекта не вызывает особых проблем. В результате этого будет достаточно:

void f1(a_struct my_struct);

Что касается передачи члена структуры в функцию, необходимо объявить функцию, принимающую тип члена. Например, чтобы передать член a_struct в функцию, вы должны сделать:

void f1(int val);

Наконец, массивы усложняют ситуацию, так как они могут быть указателем на функцию. Например, чтобы передать массив объектов a_struct, вы должны сделать это объявление:

void f1(a_struct* my_struct);

Тем не менее, вы можете просто ссылаться на параметр в обычном режиме. Например:

my_structs[1];
8

Другие решения

За f1 взять a_struct, это зависит от того, хотите ли вы редактировать его в f1, void f1(a_struct s); будет работать нормально, и сделайте копию. void f1(const a_struct & s); принимает ссылку, но вы не можете ее изменить (в любом случае, без лишних хлопот). Я стараюсь избегатьconst Рекомендации.

Если ты хочешь f2 взять int, ты пишешь void f2(int);, Неважно, где это int исходит от (т.е. внутри struct или сам по себе). Тогда назови это как f2(point.b);

Функции, которые принимают массивы, могут быть проблематичными, это зависит от того, что вы хотите с ними делать. Самый простой способ — помнить, что массив вырождается в указатель.

void f3 (a_struct * const structArray)
{ /* Do something */ }
a_struct myArray[10];
f3(myArray);

Есть и другие (лучшие) способы сделать это.

Редактировать:
Если вы хотите применить функцию к каждому элементу массива, есть (поверхностно) два подхода (которые, если подумать, на самом деле являются только одним подходом). Цикл по массиву и передать каждый элемент функции, которая принимает a_structили передать весь массив (также с параметром размера) и выполнить цикл внутри функции. То есть вы бы сделали:

a_struct myArray[10];
for (int i = 0; i < 10; ++i)
{
f1( myArray[i] );
}

// Or, better, from <algorithm>
std::for_each(myArray, myArray+10, f1);

Обратите внимание, что это не выход за пределы. Вам гарантированно разрешат сделать указатель один из конца массива (именно для этих циклических ситуаций), если он никогда не разыменовывается.

Конечно, все это предполагает, что вы действительно хотите массив, а не std::vector (в этом случае циклы выглядят в основном одинаково, за исключением того, что вы используете begin() а также end() функции-члены).

На самом деле, если у вас есть доступ к c++11 ты можешь использовать std::begin() а также std::end(), который будет работать точно так же для vectors или массивы.

3

Когда вы хотите передать структуру (или класс):

return_type fn_name(object_name)

Когда вы хотите передать один из его членов, скажем, a в этом случае.

return_type fn_name(int)

Также, если я не ошибаюсь, все параметры функций по умолчанию передаются по значению, если вы явно не укажете иное. Если вам нужно передать массивы, это будет тот же синтаксис, что и для любых других типов.

0

если вы хотите передать значение только функции-члена, отправьте ее тип
например, функция, которая принимает aastruct в качестве paramaeter, должна быть
void func (int a);

но это будет работать для вызова по значению. Если вы хотите использовать функцию call, используйте указатель.

0
По вопросам рекламы [email protected]