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*orstd::vector<b2Fixture *> *并使用:return &fixtures;

但请注意,您的向量是本地的,因此分配它以不返回指向无效位置的指针。(当然记得在使用完后释放它)。

于 2012-05-03T08:47:13.747 回答
1

目前还不清楚你想要做什么,但问题是你告诉编译器AbstractContactListener::getFixturesOfTypeCollidingWithFixture将返回 anid而你却返回一个std::vector<b2Fixture>.

从函数的名称来看,我猜您可能想要返回 a vector,因此将签名更改为:

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

当您应该推送对象时,您也在向量中推送指针:

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

向量fixtures包含b2Fixture实例,但它contact.fixtureA是一个b2Fixture*.

任何一个:

  • 取消引用它:

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

    或者,

  • 更改类型fixtures

    std::vector<b2Fixture*> fixtures;
    

函数返回类型与实际返回的内容之间也存在不匹配。如果要返回fixtures,请让返回类型与 的类型匹配fixtures

于 2012-05-03T08:46:21.680 回答