2013-03-12 19 views
9

İki çifte değişken döndürmek istiyorum: oluşturduğum bir işlevi çağırırken. Bazı öğreticilere göre (C++ 'nın temelleri ile ilgilenen), bunu yapamayacağım.Bir C++ işlevinde iki değişken döndürme

Bunu yapmanın bir yolu var mı?

+1

Sonra C++ 11'de Eğer 'tie' kullanabilirsiniz http://stackoverflow.com/q/321068/10077 atamak –

cevap

16

Sen örneğin bir std::pair kullanabilirsiniz

void setTwoDoubles(double& d1, double& d2) 
{ 
    d1 = 1.0; 
    d2 = 2.0; 
} 

double d1, d2; 
setTwoDoubles(d1, d2); 
std::cout << "d1=" << d1 << ", d2=" << d2 << std::endl 
6

işlevi içinde değerlerini ayarlayarak bir fonksiyonun içine iki çift başvurular geçebilir.

+3

Bkz: std::tuple sayfasından alınan

Örnek I bağlantılı doğrudan iki değişkene. –

0

İki işlevi bir işlevden döndüremezsiniz, ancak bir işaretçiyi bir diziye veya iki çiftli içeren başka bir yapıya geri döndürebilirsiniz.

19

Sen değişkenleri tutan basit bir yapı yazıp iade veya std::pair veya std::tuple kullanabilirsiniz:

#include <utility> 

std::pair<double, double> foo() 
{ 
    return std::make_pair(42., 3.14); 
} 

#include <iostream> 
#include <tuple> // C++11, for std::tie 
int main() 
{ 
    std::pair<double, double> p = foo(); 
    std::cout << p.first << ", " << p.second << std::endl; 

    // C++11: use std::tie to unpack into pre-existing variables 
    double x, y; 
    std::tie(x,y) = foo(); 
    std::cout << x << ", " << y << std::endl; 

    // C++17: structured bindings 
    auto [xx, yy] = foo(); // xx, yy are double 
} 
+1

Ayrıca, iki ayrı geri dönüşü yakalamak için kullanılabilen ['std :: tie'] (http://en.cppreference.com/w/cpp/utility/tuple/tie) 'den de bahsetmek isteyebilirsiniz. mevcut değişkenler. –

+0

@BenjaminLindley İyi öneri.Bir örnek eklendi. – juanchopanza

3

Teknik olarak, bir şekilde iki değişken dönmek mümkün değildir hayır dönüş zamanki bir değişken. Bununla birlikte, referansları kullanabilirsiniz. Bu şekilde, bir işleve birden çok değişken iletebilirsiniz ve fonksiyon yerine bir şey dönen yerine, onları atar:

void function(double & param1, double & param2) { 
    param1 = 6.28; 
    param2 = 3.14; 
} 

Ve bunu şöyle çağırır:

double var1, var2; 
function(var1, var2); 
2

Yapamazsın Doğrudan yapın (çünkü bir dönüş değeri tekildir).
Ancak, bir yapıya birkaç değer koyabilir ve bunu (<> çifti gibi) döndürebilirsiniz.

ortak bir model, referans ile çıkış değişkenleri döndürmektir:

ReturnVal Myfunction(/*in*/ BlahType _someParameters, /*out*/ ReturnType& _firstReturn, /*out*/ OtherReturnType& _secondReturn) 
{ 
    _firstReturn = //someStuff 
    _secondReturn = //someOtherStuff 


return SUCCESS; 
} 
3

Hayır çıkış 100 olacak

#include <iostream> 
using namespace std; 

// function declaration 
void swap(int &x, int &y); 

int main() 
{ 
    // local variable declaration: 
    int a = 100; 
    int b = 200; 

    cout << "Before swap, value of a :" << a << endl; 
    cout << "Before swap, value of b :" << b << endl; 

    /* calling a function to swap the values using variable reference.*/ 
    swap(a, b); 

    cout << "After swap, value of a :" << a << endl; 
    cout << "After swap, value of b :" << b << endl; 

    return 0; 
} 


// function definition to swap the values. 
void swap(int &x, int &y) 
{ 
    int temp; 
    temp = x; /* save the value at address x */ 
    x = y; /* put y into x */ 
    y = temp; /* put x into y */ 

    return; 
} 

olarak referans yöntemiyle kullanmak için gereken iki değişken döndüremez takas işlevini çağırmadan önce // x200 // y takas işlevini çağırmadan önce 200 // x takas işlevini çağırdıktan sonra 100 // y takas işlevini çağırdıktan sonra

bu dönüş olarak iki değer

this link help you

11

C++ 11 kullanıyorsanız, ben ideal yolu std::tuple ve std::tie kullanmaktır söyleyebilirim.

#include <tuple> 
#include <iostream> 
#include <string> 
#include <stdexcept> 

std::tuple<double, char, std::string> get_student(int id) 
{ 
    if (id == 0) return std::make_tuple(3.8, 'A', "Lisa Simpson"); 
    if (id == 1) return std::make_tuple(2.9, 'C', "Milhouse Van Houten"); 
    if (id == 2) return std::make_tuple(1.7, 'D', "Ralph Wiggum"); 
    throw std::invalid_argument("id"); 
} 

int main() 
{ 
    auto student0 = get_student(0); 
    std::cout << "ID: 0, " 
       << "GPA: " << std::get<0>(student0) << ", " 
       << "grade: " << std::get<1>(student0) << ", " 
       << "name: " << std::get<2>(student0) << '\n'; 

    double gpa1; 
    char grade1; 
    std::string name1; 
    std::tie(gpa1, grade1, name1) = get_student(1); 
    std::cout << "ID: 1, " 
       << "GPA: " << gpa1 << ", " 
       << "grade: " << grade1 << ", " 
       << "name: " << name1 << '\n'; 
} 
İlgili konular