我如何使用*pointer从函数中获取第二个值?

问题描述 投票:0回答:1

我有一个函数,我需要从那里得到两个值。函数只能返回一个值。我在某处读到我可以使用指针来获取第二个值,当我试图这样做的时候,我得到了错误,所以看起来指针的值不能超出可见区。所以这意味着我只有一个值。我如何使用指针从函数中获取第二个值?

c++ pointers console
1个回答
1
投票

某个类型的实例就是 "一个值"。考虑这个类。

struct foo {
     int bar;
     double moo;
};

现在我可以写一个函数来返回 一个 的值。

foo asdf() { 
    foo result;
    result.bar = 42;
    result.moo = 3.14159;
    return result;
}

PS: 不要使用指针. 可以使用所谓的out-parameters,但如果你这样做,你应该使用一个引用而不是一个指针。

void asdf2(int& bar,int& moo) {
     bar = 42;
     moo = 3.14159;
}

像这样调用:

int x = 0;
double y = 0.;
asdf2(x,y);

然而,out参数并不好用,因为在... ... foo f = asdf(); 与函数相比,函数返回的内容更明显。asdf2(x,y).


1
投票

你在某处读到的想法是,调用函数的代码,创建对象,传递一个指向对象的指针作为函数的参数,函数通过指针间接赋值给对象。

但是,如果你要这样做,你应该最好使用一个引用而不是指针,这样你就不必处理有人将null传给函数的可能性。

在大多数情况下,最好的方法是返回一个类的实例。尽管你只能返回一个对象,但一个类可以有多个子对象。例如,如果你想返回两个坐标到一个欧几里得空间中,你可能会这样做。

struct Point {
    double x;
    double y;
};

Point example()
{
    // until C++20
    return {
        42.,
        1337.,
    };
    // since C++20
    return {
        .x = 42.,
        .y = 1337.,
    };
}

这里,我们在一个对象中返回两个值。


0
投票

至少有三种方法。

第一种正如你已经提到的是使用指针类型的参数来返回一个值。

比如说

#include <iostream>

int minmax( int x, int y, int *max )
{
    int min = x;
    *max = y;

    if ( y < x )
    {
        min = y;
        *max = x;
    }

    return min; 
}

int main() 
{
    int min, max;

    min = minmax( 20, 10, &max );

    std::cout << "min = " << min << ", max = " << max << '\n';
}

程序输出为

min = 10, max = 20

在程序中,变量 max 是以C语言的方式进行引用传递的。

第二种方法是用C++的术语进行引用传递。例如

#include <iostream>

int minmax( int x, int y, int &max )
{
    int min = x;
    max = y;

    if ( y < x )
    {
        min = y;
        max = x;
    }

    return min; 
}

int main() 
{
    int min, max;

    min = minmax( 20, 10, max );

    std::cout << "min = " << min << ", max = " << max << '\n';
}

程序输出和上图一样。

而且你确实可以返回一个对象,但是是包含其他子对象的复合类型。例如

#include <iostream>
#include <utility>

std::pair<int, int> minmax( int x, int y )
{
    return y < x ? std::pair<int, int>( y, x ) : std::pair<int, int>( x, y );
}

int main() 
{
    auto p = minmax( 20, 10 );

    std::cout << "min = " << p.first << ", max = " << p.second << '\n';
}

程序输出也与第一个演示程序所示相同。

你可以用类模板std::pair代替拥有两个数据成员的标准类模板 std::tuple 如果你想返回两个以上的对象。或者你可以把自己的复合类型(模板或不模板)写成一个结构或类。

例如

#include <iostream>
#include <tuple>

std::tuple<int, int, int> get_sorted( int x, int y, int z )
{
    if ( not ( y < x ) && not ( z < x ) )
    {
        return not ( z < y ) ? std::make_tuple( x, y, z )
                             : std::make_tuple( x, z, y );
    }
    else if ( not ( z < y ) )
    {
        return not ( z < x ) ? std::make_tuple( y, x, z )
                             : std::make_tuple( y, z, x );
    }
    else
    {
        return not ( y < x ) ? std::make_tuple( z, x, y )
                             : std::make_tuple( z, y, x );
    }
}

int main() 
{
    auto t = get_sorted( 15, 10, 20 );

    std::cout << "( " << std::get<0>( t ) 
              << ", " << std::get<1>( t )
              << ", " << std::get<2>( t )
              << " )\n";
}

程序输出为

( 10, 15, 20 )
© www.soinside.com 2019 - 2024. All rights reserved.