2010-04-03 60 views
11

thể trùng lặp:
Returning multiple values from a C++ functionmột hàm có thể trả về nhiều hơn một giá trị không?

thể một hàm trả về nhiều hơn một giá trị?

Sửa
Trừ trở lại bằng cách tham khảo.

+2

Ngôn ngữ thuyết bất khả tri hoặc C++? –

+1

Trong trường hợp bạn muốn có tổng quan về ngôn ngữ bất khả tri, đây là câu hỏi: http://stackoverflow.com/questions/1468375/how-do-you-return-two-values-from-a-single-method –

+0

Bạn có thể trả lại dưới dạng mảng hoặc bạn có thể chuyển mảng dưới dạng tham chiếu và lưu trữ các giá trị này vào mảng đó. – pocoa

Trả lời

11

Không, nhưng bạn có thể trả về một pair hoặc boost::tuple có thể chứa nhiều giá trị.

Bên cạnh đó, bạn có thể sử dụng tài liệu tham khảo để trả lại nhiều giá trị như thế này:

void MyFunction(int a, int b, int& sum, int& difference); 

Bạn sẽ gọi hàm này như sau:

int result_sum; 
int result_difference; 
MyFunction(1, 2, result_sum, result_difference); 

Như Hogan chỉ ra, kỹ thuật này không phải là trả lại nhiều biến, tuy nhiên nó là một thay thế tốt.

+7

Chọn Nit: "Ngoài ra, bạn có thể trả lại nhiều giá trị như sau:" phải là "Ngoài ra, bạn có thể sửa đổi nhiều giá trị như thế này:". Bạn cũng có thể sửa đổi các biến phạm vi toàn cầu. – Hogan

14

Có - để chức năng của bạn trả về cấu trúc. Hoặc trả về các giá trị thông qua tham số tham chiếu.

struct A { 
    int x, y; 
    A(int a, int y) : x(x), y(y) {} 
}; 

A myfun() { 
    return A(0, 42); // return two values 
} 

hay:

void myfun(int & a, int & b) { 
    a = 0; 
    b = 42; 
} 
+4

Mặc dù về mặt kỹ thuật, đó vẫn là một giá trị trong C –

+0

Câu trả lời có được trả lời cho câu hỏi hay không: "Chức năng có thể sửa đổi nhiều giá trị không?" Nó cũng có thể sửa đổi globals nếu bạn muốn được hoàn thành. – Hogan

+0

nhưng vẫn chỉ có một giá trị (địa chỉ của nó) đã được gửi và chúng tôi có thể truy cập toàn bộ đối tượng bằng cách sao chép nó vào đối tượng khác. tôi muốn biết cụ thể liệu chúng tôi có thể gán hai giá trị cùng một lúc hay không. –

1

Một chức năng có thể trở lại giá trị trong cách quy định:

  • Via giá trị trả về của bất kỳ loại
  • Qua một con trỏ
  • Qua một tham chiếu
  • Via thiết lập một biến toàn cầu (cao không được khuyến khích)

Nếu bạn cần giá trị trả lại tự chứa, bạn thường sẽ bao bọc các loại bạn cần trong cấu trúc và trả về một đối tượng của cấu trúc đó theo giá trị. Nếu bạn muốn tránh việc giữ một bản sao cục bộ, bạn sẽ chuyển vào một tham số tham chiếu cần sửa đổi.

18

Trong thư viện boost::tuple, có a function called tie giúp đơn giản hóa quá trình nhận thông tin từ một trả lại tuple. Nếu bạn có hàm trả về một tuple của hai số double và muốn tải những biến đó thành hai biến cục bộ xy, bạn có thể chỉ định giá trị trả về của hàm cho boost::tie(x, y).

Ví dụ:

#include <math.h> 
#include <iostream> 
#include <boost/tuple/tuple.hpp> 

const double PI = 3.14159265; 

boost::tuple<double, double> polar_to_rectangular(double radius, double angle) 
{ 
    return boost::make_tuple(radius * cos(angle), radius * sin(angle)); 
} 

int main() 
{ 
    double x; 
    double y; 

    boost::tie(x, y) = polar_to_rectangular(4, (45 * PI)/180); 
    std::cout << "x == " << x << ", y == " << y << std::endl; 

    return 0; 
} 
+4

tuyệt vời, không biết rằng –

-4
main() 
{ 
    int a=10,b=20; 
    int *c; 
    c=aa(a,b); 
    printf("%d %d",*c,*c+1); 
} 

void aa(int a,int b) 
{ 
    int c1[2]; 
    c1[0]=b+a; 
    c1[1]=a-b; 
    return(c1); 
} 

đây, địa chỉ của c1 sẽ trở lại. vì vậy nó sẽ lưu trữ trong c chính có thể.chúng tôi có thể thử cả hai biến thông qua con trỏ,

+2

Dẫn đến hành vi không xác định. Thời gian của 'c1' kết thúc khi' aa' bị bỏ lại, vì vậy 'c' được trỏ sang trái tại một đối tượng đã chết. Truy cập nó dẫn đến hành vi không xác định. – GManNickG

+2

hành vi không xác định. –

0

sử dụng cấu trúc và trả về nhiều giá trị với loại dữ liệu khác nhau.

1
#include<stdio.h> 
#include<stdlib.h> 
#include<string.h> 

typedef struct 
{ 
    int a; 
    int b; 
}Mystruct; 

Mystruct myfun(); 

int main() 
{ 
    char name[30]; 
    Mystruct ms2; 
    ms2 = myfun(); 
    printf("val1: %d val2: %d",ms2.a,ms2.b); 
    return 0; 
} 

Mystruct myfun() 
{ 
    int a,b; 
    Mystruct ms; 

    a = 10; 
    b = 20; 
    ms.a=a; 
    ms.b=b; 

    return(ms); 
} 
Các vấn đề liên quan