С++ передать параметр по ссылке на другую функцию в функции

Я новичок в c/c++, и я пытаюсь создать программу для генетического алгоритма (используя MS Visual Studio 2013). Я пощажу вам подробности этой программы, но у меня есть проблема с "передачей параметров по ссылке". Могу ли я передать параметр по ссылке на другую функцию внутри функции? Здесь вы можете найти простой пример моего кода.

struct solution{
int list1[100];
int list2[100];
int list3[100];
int list4[100];
};

void function1(solution& foo)
{
// Algorithm that fills list2
function2(foo);   // Fills in list3
function3(foo);   // Fills in list4
}

void function2(solution& foo)
{
// algorithm to fill in list3
}

void function3(solution& foo)
{
// algorithm to fill in list4
}

void localSearch(solution& foo)
{
for(int i = 0; i < 10; i++)
{
    // Change a random value in list1 of foo
    // Rerun function1 and see if it is a better solution
    function1(foo);
}
}

int main()
{
solution bar;
// Fill list1 of bar randomly by other function

function1(bar);
// Output finished solution

return 0;
}

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

Поэтому мои вопросы:

1) Можно ли передать (по ссылке) параметр, переданный ссылкой на другую функцию, в функции1?

2) Что было бы лучшим решением?

-2
источник поделиться
1 ответ

1) Можно ли передать (по ссылке) параметр, переданный ссылкой на другую функцию, в функции1?

Да, можно передать одну и ту же переменную, ссылаясь на другую функцию.

void f1(My_Class& m); // Forward declaration.
void f2(My_Class& m);

void f1(My_Class& m) // Definition.
{
    f2(m);
}

void f2(My_Class& m)
{
   ;
}

В переднем объявлении компилятор "подгоняет" о том, как использовать функции (их синтаксис). Без форвардных объявлений компилятор получит знания из своих определений. Тем не менее, определения или форвардные декларации должны поступать перед вызовом функции.

2) Что было бы лучшим решением?

Вот некоторые идеи для улучшения вашего решения:
1) Используйте std::vector вместо массивов.

2) Рассмотрим std::vector структур, а не структуру массивов:

   struct List_Record
   {
      int item1;
      int item2;
      int item3;
      int item4;
   };
   std::vector<List_Record> My_Lists(100);
// or
   List_Record My_Array[100];

Наличие элементов в структуре или записи позволяет лучше управлять кешем данных процессором (все элементы в строке размещаются смежно).

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

0
источник

Посмотрите другие вопросы по меткам или Задайте вопрос