0

このC++メソッドでb2Fixtureインスタンスの配列を返そうとしています。これは、次のように定義された一連のJRContactインスタンスを繰り返します。

struct JRContact {
    b2Fixture *fixtureA;
    b2Fixture *fixtureB;
    bool operator==(const JRContact& other) const
    {
        return (fixtureA == other.fixtureA) && (fixtureB == other.fixtureB);
    }
};

nb私はC++をまったく知らないので、そのコードで行った可能性のある奇妙なことについて言及することを躊躇しないでください;-)

以下はコンパイルに失敗します(MacOSのXCodeコンパイラ)。コメントのエラーを参照してください。

id AbstractContactListener::getFixturesOfTypeCollidingWithFixture(b2Fixture *fix, int type){

    std::vector<b2Fixture> fixtures;

    std::vector<JRContact>::iterator ct;
    JRContact contact;

    for (ct = _contacts.begin(); ct != _contacts.end(); ct++){

        contact = *ct;

        if ( 
                ( (fix == contact.fixtureA) || (fix == contact.fixtureB) ) &&
                ( contactContainsType(contact, type) )
            ){

            if (fix == contact.fixtureA) {

                // error: Semantic Issue: Reference to type 'const value_type' (aka 'const b2Fixture') could not bind to an lvalue of type 'b2Fixture *'

                fixtures.push_back(contact.fixtureB);
            }

            else {

                // error: Semantic Issue: Reference to type 'const value_type' (aka 'const b2Fixture') could not bind to an lvalue of type 'b2Fixture *'
                fixtures.push_back(contact.fixtureA);
            }
        }
    }

    // error: Semantic Issue: No viable conversion from 'std::vector<b2Fixture>' to 'id'
    return fixtures;
}

御時間ありがとうございます!

4

3 に答える 3

2

変化 :

std::vector<b2Fixture> fixtures;

に :

std::vector<b2Fixture *> fixtures;

戻り値の型については、void*またはstd::vector<b2Fixture *> *に変更して使用できます。return &fixtures;

ただし、ベクトルはローカルであるため、無効な場所へのポインターを返さないように割り当ててください。(もちろん、使い終わったら忘れずに解放してください)。

于 2012-05-03T08:47:13.747 に答える
1

何をしたいのかははっきりしていませんが、問題はコンパイラにAbstractContactListener::getFixturesOfTypeCollidingWithFixtureを返すように指示していて、id代わりに を返していることですstd::vector<b2Fixture>

関数の名前から、 を返したいと思うvectorので、署名を次のように変更します。

std::vector<b2Fixture> AbstractContactListener::getFixturesOfTypeCollidingWithFixture
                                                      (b2Fixture *fix, int type)

また、オブジェクトをプッシュする必要があるときに、ベクトルにポインターをプッシュしています。

fixtures.push_back(*(contact.fixtureB));
于 2012-05-03T08:46:19.517 に答える
1

ベクトルはインスタンスをfixtures保持しますが、は.b2Fixturecontact.fixtureAb2Fixture*

また:

  • それを逆参照します。

    fixtures.push_back(*(contact.fixtureA)); // Same for 'fixtureB'.
    

    また、

  • のタイプを変更しfixturesます:

    std::vector<b2Fixture*> fixtures;
    

関数の戻り値の型と実際に返されるものとの間にも不一致があります。を返したい場合fixturesは、戻り値の型を の型と一致させfixturesます。

于 2012-05-03T08:46:21.680 に答える