我可以通过命令行参数定期读取参数(例如a和b)作为c ++代码的输入。
问:我如何在其他几个函数(不是主函数)中使用这两个参数,因此它们的行为类似于" global"变量。这是一个例子,范围a和b只是主要而不是func1和func2。如何为func1和func2制作a和b?谢谢你的帮助!
int main (int argc , char* argv[])
{
double a=atof(argv[1]);
double b=atof(argv[2]);
return 0;
}
double func1(double x)
{
return x+a+b;
}
double func2(double x)
{
return x*x+a*b;
}
答案 0 :(得分:3)
使用全局变量:
double a;
double b;
int main (int argc , char* argv[])
{
a=atof(argv[1]);
b=atof(argv[2]);
return 0;
}
double func1(double x)
{
return x+a+b;
}
double func2(double x)
{
return x*x+a*b;
}
或功能参数:
int main (int argc , char* argv[])
{
double a=atof(argv[1]);
double b=atof(argv[2]);
double x = 13.1;
double someVal = func1(x, a, b);
double someOtherVal = func2(x, a, b);
return 0;
}
double func1(double x, double a, double b)
{
return x+a+b;
}
double func2(double x, double a, double b)
{
return x*x+a*b;
}
如果您希望数据在函数外部持久存在,则它需要是全局变量,或者您需要使用函数参数和返回值来维护数据范围。更不用说其他形式的面向对象设计,正如其他人提到的那样可以完成你正在做的任何事情......这就像你能得到的一样优雅。
答案 1 :(得分:0)
您可以将它们复制到实际的全局变量中。
答案 2 :(得分:0)
像这样:
double a, b;
int main()
{
a=atof(argv[1]);
b=atof(argv[2]);
return 0;
}
double func1(double x)
{
return x+a+b;
}
double func2(double x)
{
return x*x+a*b;
}
答案 3 :(得分:0)
将任何数据提供给程序其他部分的方法相同:将它们分配给全局变量或将它们作为函数参数传递。
答案 4 :(得分:0)
我喜欢在一个对象中存储参数以保持整洁,避免传递大量松散的参数。
class Arguments
{
public:
Arguments(double a, double b) : A(a), B(b)
{
}
double A;
double B;
};
double func1(const Arguments& args, double x)
{
return x + args.A + args.B;
}
int main(int argc, char* argv[])
{
const Arguments args(atof(argv[1]), atof(argv[2]));
const double x = 22;
const double result = func1(args, x);
return 0;
}
如果你需要传递许多命名参数,例如program --align 2 --method shortest --color orange
,boost::program_options可以为你节省一些麻烦。
答案 5 :(得分:0)
也许你想要这样的东西:
#include <numeric>
#include <vector>
#include <algorithm>
#include <iterator>
#include <cstdlib>
#include <iostream>
int main (int argc , char* argv[])
{
std::vector<double> values;
std::transform(&argv[1], &argv[argc], std::back_inserter(values), atof);
std::cout << func1(3.4, values) << std::endl;
return 0;
}
double func1(double x, const std::vector<double>& values)
{
return std::accumulate(values.begin(), values.end(), x);
}
double func2(double x, const std::vector<double>& values)
{
// Do something similar here
}
请注意,您需要使用兼容c ++ 11的编译器才能使用此代码。 GCC 4.7+应该能够编译它