从c++函数中返回多个值的首选方法是什么?例如,假设有一个函数对两个整数进行除法并同时返回商和余数。我经常看到的一种方法是使用引用形参:
void divide(int dividend, int divisor, int& quotient, int& remainder);
一种变体是返回一个值,并通过引用形参传递另一个值:
int divide(int dividend, int divisor, int& remainder);
另一种方法是声明一个结构体来包含所有的结果并返回:
struct divide_result {
int quotient;
int remainder;
};
divide_result divide(int dividend, int divisor);
这些方法中是否有一种通常是首选的,还是有其他的建议?
编辑:在实际代码中,可能会有两个以上的结果。它们也可能是不同类型的。
OO解决方案是创建一个比率类。它不需要任何额外的代码(会节省一些代码),会明显更干净/清晰,并且会给你一些额外的重构,让你也可以清理这个类之外的代码。
实际上,我认为有人建议返回一个结构,这是足够接近,但隐藏的意图,这需要一个充分考虑的类与构造函数和一些方法,事实上,你最初提到的“方法”(作为返回对)应该最有可能是这个类的成员,返回自己的实例。
我知道你的例子只是一个“例子”,但事实是,除非你的函数做的比任何函数都要多,如果你想让它返回多个值,你几乎肯定会错过一个对象。
不要害怕创建这些小的类来做小的工作——这就是OO的神奇之处——你最终会分解它,直到每个方法都非常小而简单,每个类都非常小而可理解。
另一件事应该是一个错误的指示器:在OO中,你基本上没有数据——OO不是传递数据,一个类需要在内部管理和操作它自己的数据,任何数据传递(包括访问器)都是一个迹象,表明你可能需要重新考虑一些事情。
如果只有几个返回值,我只会通过引用来做,但对于更复杂的类型,你也可以这样做:
static struct SomeReturnType {int a,b,c; string str;} SomeFunction()
{
return {1,2,3,string("hello world")}; // make sure you return values in the right order!
}
如果返回类型只是一个临时返回类型,则使用“static”将返回类型的范围限制在这个编译单元。
SomeReturnType st = SomeFunction();
cout << "a " << st.a << endl;
cout << "b " << st.b << endl;
cout << "c " << st.c << endl;
cout << "str " << st.str << endl;
这绝对不是最漂亮的方法,但它是有效的。