【问题标题】:C++: how to use pass by reference to return multiple values in a method?C++:如何使用传递引用在一个方法中返回多个值?
【发布时间】:2019-01-02 18:48:33
【问题描述】:

我需要返回两个双打。我对按引用传递有点了解,但我不确定如何使用它来返回多个。这是我到目前为止所尝试的。我做了两个参考参数并将其添加到我希望返回两个值的方法中。

#include "stdafx.h" 
#include <iostream>
using namespace std;
int main() {
  double min;
  double max;
  getDistance(766, 981, 328, 609, min, max);
  getDistance(899, 171, 1009, 282, min, max);
  cout << "Minimum distance is "+minDistance+"inches";
  cout << "Maximum distance is "+maxDistance+"inches";
  return 0;
}

void getDistance(int left, int right, int top, int bottom, double& minDistance, double& maxDistance) {
  int height=bottom - top;
  int width=right - left;
  bool isCNN=width !=height;
  if (isCNN) {
    if (width >=215 && height >=281) minDistance=0;
    maxDistance=14;
    else if (width >=124 && height >=167) minDistance=14;
    maxDistance=33.75;
    else if (width >=76 && height >=111) minDistance=33.75;
    maxDistance=53.5;
    else if (width >=56 && height >=94) minDistance=53.5;
    maxDistance=73.25;
    else if (width >=49 && height >=84) minDistance=73.25;
    maxDistance=93;
    else if (width >=41 && height >=71) minDistance=93;
    maxDistance=112.75;
    else if (width >=28 && height >=57) minDistance=132.5;
    maxDistance=172;
    else if (width >=23 && height >=49) minDistance=191.75;
    maxDistance=270.75;
    else minDistance=270.75;
    maxDistance=480;
  }
  else {
    if (width >=330) minDistance=0;
    maxDistance=6.375;
    else if (width >=238) minDistance=6.375;
    maxDistance=16.25;
    else if (width >=168) minDistance=16.25;
    maxDistance=26.125;
    else if (width >=122) minDistance=26.125;
    maxDistance=36;
    else if (width >=108) minDistance=36;
    maxDistance=55.75;
    else if (width >=91) minDistance=55.75;
    maxDistance=75.5;
    else minDistance=75.5;
    maxDistance=144;
  }
  return;
}

价值观。

【问题讨论】:

  • 只需传递两个引用。每个返回值一个。
  • 你应该展示你迄今为止所尝试的。如果你不知道如何通过引用,我建议从good c++ book学习。
  • 请不要这样做。返回两个值。
  • ifelse 语句的使用有点不靠谱。 if (width &gt;=215 &amp;&amp; height &gt;=281) minDistance=0; 是整个 ifmaxDistance=14;if 之外,因此else 断开连接。这会导致一连串错误消息。大括号是必需的:if (width &gt;= 215 &amp;&amp; height &gt;= 281) { minDistance = 0; maxDistance = 14; }

标签: c++ xcode pass-by-reference multiple-return-values


【解决方案1】:

您可以使用std::pair&lt;double, double&gt; 作为返回类型。例如

std::pair<double, double> foo()
{
   return {10, 20};
}

【讨论】:

    【解决方案2】:

    如果您真的想通过引用传递“返回”两个值:

    void foo(int& x, int& y)
    {
        x = 55;
        y = 66;
    }
    
    int main()
    {
        int x = 0;
        int y = 0;
        foo(x, y);
        if (x == 55 && y == 66)
        {
            return 0;
        }
        else
        {
            return 1;
        }
    }
    

    应该这样做。正如其他人所指出的,还有许多其他方法可以实际返回两个值,但在这里你去吧。

    在您提交的代码中,(语法问题除外),您需要在cout 语句的main 方法中引用minmax。在getDistance()minDistancemaxDistance 中,您已经为传递给它的双打创建了别名,但这些别名在函数之外不存在!

    【讨论】:

      【解决方案3】:

      正如其他人所指出的,除了通过引用传递之外,还有其他方法可以返回 2 个值。如果您确实想通过引用返回,那么您所写的几乎是正确的。而不是在主方法中使用变量“minDistance”和“maxDistance”(它们没有被声明),你应该使用你已经声明的“min”和“max”变量。此外,您应该使用 '

      重写您的代码以将这些更改考虑在内(但不以任何方式确保您的“计算”的正确性)给出:

      #include <iostream>
      
      int main(int, char**) {
        double min;
        double max;
        getDistance(766, 981, 328, 609, min, max);
        getDistance(899, 171, 1009, 282, min, max);
        std::cout << "Minimum distance is " << min << "inches" << std::endl;
        std::cout << "Maximum distance is " << max << "inches" << std::endl;
        return 0;
      }
      
      void getDistance(int left, int right, int top, int bottom, double& minDistance, double& maxDistance) {
        int height = bottom - top;
        int width = right - left;
        bool isCNN = width !=height;
      
        if (isCNN) {
          if (width >=215 && height >=281) {
            minDistance=0;
            maxDistance=14;
          } else if (width >=124 && height >=167) {
            minDistance=14;
            maxDistance=33.75;
          } else if (width >=76 && height >=111) {
            minDistance=33.75;
           maxDistance=53.5;
          } else if (width >=56 && height >=94) {
            minDistance=53.5;
            maxDistance=73.25;
          } else if (width >=49 && height >=84) {
            minDistance=73.25;
            maxDistance=93;
          } else if (width >=41 && height >=71) {
            minDistance=93;
            maxDistance=112.75;
          } else if (width >=28 && height >=57) {
            minDistance=132.5;
            maxDistance=172;
          } else if (width >=23 && height >=49) {
            minDistance=191.75;
            maxDistance=270.75;
          } else {
            minDistance=270.75;
            maxDistance=480;
          }
        } else {
          if (width >=330) {
            minDistance=0;
            maxDistance=6.375;
          } else if (width >=238) {
            minDistance=6.375;
            maxDistance=16.25;
          } else if (width >=168) {
            minDistance=16.25;
            maxDistance=26.125;
          } else if (width >=122) {
            minDistance=26.125;
            maxDistance=36;
          } else if (width >=108) {
            minDistance=36;
            maxDistance=55.75;
          } else if (width >=91) {
            minDistance=55.75;
            maxDistance=75.5;
          } else {
            minDistance=75.5;
            maxDistance=144;
          }
        }
        return;
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-06-23
        • 2014-08-02
        • 1970-01-01
        • 2017-10-01
        • 2019-12-13
        • 1970-01-01
        • 2013-06-18
        • 2021-12-02
        相关资源
        最近更新 更多