4

ユーザーから 2 つの入力値を単純に取得し、それらの値をメイン関数が使用できるように返す関数を作成できるようにしたいと考えています。

値 a と b が getvals 関数内に存在し、メイン関数に x と y として渡されるようにしたいと考えています。

私は多くのことを検索し、これを行うための同様の方法を見つけることができないため、ここで間違った方法で物事を進めている可能性があると思いますが、助けていただければ幸いです.

#include <iostream>

using namespace std;


int x = 100;
int y = 42;
int result1;
int result2;
int a;
int b;

int getvals(int,int)
{
    cout << "input value a ";
    cin >> a;
    cout << "input value b ";
    cin >> b;

    return a,b;
}

int main()
{
    getvals(x,y);
    result1 = x + y;


    cout << "\n\n";
    cout << " x + y = " << result1;
    return 0;
}
4

5 に答える 5

8

関数から返せる値は 1 つだけです。幸いなことに、構造体またはクラスで 2 つの値をラップし、それを 1 つのオブジェクトとして返すことができます。これはまさにそのstd::pairために設計されたものです。

std::pair<int,int> getvals()
{
    std::pair<int,int> p;
    cout << "input value a ";
    cin >> p.first;
    cout << "input value b ";
    cin >> p.second;

    return p;
}

int main()
{
    std::pair<int,int> p = getvals();
    int result1 = p.first + p.second;
    ...
}

C++11std::tupleでは、任意の数の要素を許可する、より一般的な が導入されています。

std::tuple<int,int> getvals()
{
    int a,b;
    cout << "input value a ";
    cin >> a;
    cout << "input value b ";
    cin >> b;

    return std::make_tuple(a,b);
}

int main()
{
    int x,y;
    std::tie(x,y) = getvals();
    ...
}
于 2013-08-15T22:19:41.927 に答える
4

aおよびの参照を使用しますb

void getvals(int &a, int &b)
{
    cout << "input value a ";
    cin >> a;
    cout << "input value b ";
    cin >> b;
}

getvals()これは、2 つの参照パラメーターを取ることを宣言します。オブジェクトの参照を変更すると、関数呼び出しに渡されたオブジェクトが変更されます。

参照がない場合、パラメーターは値によって渡され、関数に渡されたオブジェクトのコピーが作成されます。次に、関数内のパラメーターに加えられた変更は、コピーにのみ影響します。

または、関数から 2 つの整数値を返すために使用できます(その場合、出力パラメーターstd::pair<int, int>は必要ありません)。およびメンバーを変数andに手動でアンパックするか、ヘルパー クラスを実装してそれを行うことができます。例えば:firstsecondxy

std::pair<int, int> getvals () {
    std::pair<int, int> p;
    std::cin >> p.first;
    std::cin >> p.second;
    return p;
}

template <typename T, typename U>
struct std_pair_receiver {
    T &first;
    U &second;
    std_pair_receiver (T &a, U &b) : first(a), second(b) {}
    std::pair<T, U> operator = (std::pair<T, U> p) {
        first = p.first;
        second = p.second;
        return p;
    }
};

template <typename T, typename U>
std_pair_receiver<T, U> receive_pair (T &a, U &b) {
    return std_pair_receiver<T, U>(a, b);
}

int main () {
    int x, y;
    receive_pair(x, y) = getvals();
    //...
}

C++11 を利用できる場合は、より一般的なtupleヘルパーtieを使用して、よりクリーンな方法で同様に行うことができます。これは、Benjamin Lindley の回答に示されています。

于 2013-08-15T22:18:37.433 に答える
2

パラメータを介して戻る途中のようです。変更する必要があるのはこれだけです:

void getvals( int& a, int& b )
{
    cout << "input value a ";
    cin >> a;
    cout << "input value b ";
    cin >> b;
}

&参照渡しを意味するパラメータ名の前にあることに注意してください。つまり、関数で変更すると、呼び出し元でも変更されます。いいえreturn、必要ありません。

于 2013-08-15T22:19:21.393 に答える