通过引用传递值

时间:2014-12-19 16:51:18

标签: c++

我理解通过引用传递参数意味着什么。引用是一种允许用户声明对象的新名称的构造。此外,它允许从通过引用传递变量的函数返回多个值。

例如:

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;

希望有人可以帮忙解决这个问题。

3 个答案:

答案 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);
}

仍然有一些错误,但至少可以得到一些东西。