我理解通过引用传递参数意味着什么。引用是一种允许用户声明对象的新名称的构造。此外,它允许从通过引用传递变量的函数返回多个值。
例如:
int i = 7;
int& r=i;
r=9;
i=10;
return r;
return i;
但是,我没有把它与我的功能相匹配:
int Search(int depth, board b)
{
board b = combined();
int w = 0;
w = Evaluate(b);
int score;
int bestScore = std::numeric_limits<int>::min();
bool bestMove = false;
if(depth == 0) return w;
int x=0, int y=0;
for (int x = 0; x < 9; ++y) {
for (int y = 0; y < 9; ++y) {
while (!occupied(x,y));
make_move(x, y);
score = -Search(depth-1,b); // recursion
unMake(b);
if(score > bestScore) {
bestScore = score;
bestMove = (x,y);
}
}
}
return bestScore;
return bestMove;
}
除非我能写
,否则我肯定会遗漏一些东西int & score = bestScore;
int& (x,y) = bestMove;
return bestScore;
return bestMove;
希望有人可以帮忙解决这个问题。
答案 0 :(得分:7)
它允许从传递的函数返回多个值 通过引用变量。
没有。函数始终只返回一个值。您可以通过引用传递参数并在函数内修改它们(除非它是一个常量引用),这将修改它们的值。考虑这个例子:
void Foo (int x)
{
++x;
}
void Bar (int &x)
{
++x;
}
int x = 0;
Foo (x);
// x is still 0
Bar (x);
// x is now 1
如果要从函数返回多个对象,请使用std::tuple
(如下面提到的Richard Hodges)或定义struct
。前者更简单,但混合元组的元素相对容易。后者有更多的开销,但你有明确的成员名称。
至于你的情况,你需要像
这样的东西std::tuple <int, bool> Search(int depth, board b)
{
int bestScore = std::numeric_limits<int>::min();
bool bestMove = false;
// do stuff
return std::make_tuple (bestScore, bestMove);
}
或
struct Best
{
int Score;
bool Move;
};
Best Search(int depth, board b)
{
Best best = { std::numeric_limits<int>::min(), false };
// do stuff with best.Score and best.Move
return best;
}
答案 1 :(得分:2)
从函数返回多个值,传统和安全的方法是使用std :: tuple。
看起来你的函数想要返回最佳分数和最佳坐标,所以从一个如下声明开始:
// holds an x/y coordinate
struct XY {
// need to declare stuff here
};
std::tuple<int, XY> Search(...args....)
{
// perform calculations here
...
// return the best move
return std::make_tuple(bestScore, bestXY);
}
答案 2 :(得分:0)
Ok.Thanks。像这样:
struct XY {
int score;
XY;
}
tuple<int, XY> Search(int depth, board b)
{
board b = combined();
int w = 0;
w = Evaluate(b);
int bestScore = std::numeric_limits<int>::min();
bool bestMove = false;
if(depth == 0) return w;
int x=0, int y=0;
for (int x = 0; x < 9; ++x) {
for (int y = 0; y < 9; ++y) {
while (!occupied(x,y));
make_move(x, y);
score = -Search(depth-1,b); // recursion
unMake(b);
if(score > bestScore) {
bestScore = score;
bestMove = (x,y);
}
}
}
// return the best move
return make_tuple(bestScore, bestXY);
}
仍然有一些错误,但至少可以得到一些东西。