我是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;
}
如果我尝试这样做,我会遇到各种各样的错误......接下来,我的解决方案结构被破坏,list1中的第一个位置随机变回0。 我尝试了几件事来缓解这种情况,但似乎没有任何效果。如果我只是通过值将解决方案传递给function1,程序似乎运行,但速度更慢,因为它必须复制这个大型结构。
所以我的问题是:
1)是否可以在函数1中通过引用传递给另一个函数的参数传递(通过引用)?
2)什么是更好的解决方案?
答案 0 :(得分:0)
1)是否可以在function1中传递(通过引用)通过引用另一个函数传递的参数?
是的,可以通过引用另一个函数传递相同的变量。
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)在结构中创建一个初始化方法。
您应该有一个构造函数,用于加载具有默认值的数据项
考虑添加一个从文件加载数据项的方法(对测试非常有用)。