16347


Cocos2d-xでプログラミングをしていると、関数の返り値は1つしか指定できないことに気付きました。返り値が2つ以上あった場合はどのように指定すれば良いのでしょうか？  
以下のchangeTwoSpritePositionX()は、2つのSpriteのX座標を指定された値に変更し、2つのSpriteを返しくれる関数です。正常に動作させるには、どのような修正を加えればよいでしょうか？詳しい方、ご教示ください。

[code]

    void changeTwoSpritePositonX(Sprite *spriteA,Sprite *spriteB,float positionX){
      spriteA->setPosition(Point(positionX,spriteA->getPositionY()));
      spriteB->setPosition(Point(positionX,spriteB->getPositionY()));
      // return ここでspriteAとspriteBを返したい
    }
    
[/code]


CC BY-SA 3.0
2015-09-04T12:52:05.947
16259
2015-09-08T04:46:59.817
2015-09-08T04:46:59.817
76
7699
question
c++ cocos2d-x
関数において返り値を2つ以上指定する方法


配列を返すか返値用の構造体を定義して返すといいと思います


CC BY-SA 3.0
2015-09-04T15:07:45.007
16262
2015-09-04T15:07:45.007
7566
16259
answer


alphaさんが仰っていますが、spriteAとspriteBのポインターを渡しているので返さなくても変更されています。spriteAとspriteBは、中身が変わっているのでcinやprintf等でご確認ください。

後、2つの値を返すのは無理なので、ポインタや参照というものがあるのです。（それ以外の理由もありますが！）


CC BY-SA 3.0
2015-09-06T04:46:22.390
16298
2015-09-06T04:46:22.390
11194
16259
answer


まず、複数の戻り値を指定することは現在のC++ではできません。提示されたコードの場合は、ポインターが引数となっているためそのままでも利用できます。

[code]

    #include<iostream>
    using namespace std;
    
    void f(int * i)
    {
       *i = 6;
    }
    int main()
    {
       int * int_ptr = new int(5);
       cout << *int_ptr << endl;
       f(int_ptr);
       cout << *int_ptr << endl;
    }
    
[/code]

このように上記のコードを実行すればほかの方の回答が理解できると思います。

とりあえず以下が元の質問への回答です。  
structなどを利用することにより、戻り値に複数に要素を持たせることができます。

1.container(例えばvectorなど)に格納して返す

[code]

    std::vector<Sprite*> return_val;
    return_val.push_back(spriteA);
    return_val.push_back(spriteB);
    return(return_val);
    
[/code]

ただし、containerにポインターを格納するのは一般的に良い考えではありません。なお要素はoperator[]でアクセスできます。また、iteratorなどでもアクセスできます。

2.std::pairもしくはstd::tuppleを返す

[code]

    return(std::make_pair(spriteA,spriteB));
    
[/code]

もしくは

[code]

    return(std::make_tuple(spriteA,spriteB));
    
[/code]

また、pairの場合は.first、.second、tupleの場合はgetで要素にアクセスできます。

3.struct、classを使う

[code]

    struct sprite_ptr_container
    {
       sprite * _ptr1;
       sprite * _ptr2;
    }
    
[/code]


CC BY-SA 3.0
2015-09-07T11:38:07.340
16347
2015-09-07T11:38:07.340
16259
answer


"複数の戻り値を関数で返すこと" だけを考えると、C++ で行うのは STL の`std::pair` や `std::tuple` を使う方法です。

[code]

    std::pair<int, int> double_result()
    {
        return std::make_pair(1, 10);
    }
    
    int a, b;
    std::tie(a, b) = double_result();
    
[/code]

のように、複数の結果を `std::pair` でラップし、`std::tie` 関数で取り出すことをよく行っています。


CC BY-SA 3.0
2015-09-08T04:30:59.167
16365
2015-09-08T04:30:59.167
264
16259
answer