1

私はこのコードで立ち往生しています:

class MyObject
{
public:
    int value;
}

class MyClass
{
private:
    btAlignedObjectArray<MyObject*> m_objects;

public:

    int comp (MyObject *a, MyObject *b)
    {
        return calculateTheNewValue(a->value) < calculateTheNewValue(b->value);
    }

    void doSort()
    {
        m_objects.quickSort(comp);
    }

    //edit: this member function is needed to do the sorting
    int calculateTheNewValue(int v)
    {
            // do some calculation using other members variables, not necessarily m_objects
    }

};

comp は非静的メンバー関数であるため、コンパイルされません。

comp はメンバー変数 m_objects にアクセスする必要があるため、静的にすることはできません。

また、m_objects のカプセル化を無効にして静的関数を作成し、このように呼び出します。

MyClass::doSort(myClass.m_objects)

編集

これは btAlignedObjectArray の宣言です

http://bulletphysics.org/Bullet/BulletFull/btAlignedObjectArray_8h_source.html

行 365 には宣言またはquicksort

4

1 に答える 1

2

二項関数にする必要がある場合はcomp、それをファンクターでラップします。C++11 を使用できる場合は、ラムダを使用します。

m_objects.quickSort([&](MyObject * lhs, MyObject * rhs) {
        return this->comp(lhs,rhs)
    });

C++11 を使用できない場合は、同様の動作を持つファンクター クラスを作成します。

struct compare
{
    MyObject & obj_;
    compare(MyObject& obj) :obj_(obj) {}

    bool operator()(MyObject * lhs, MyObject * rhs) const {
        return obj_.comp(lhs,rhs);
    }
};

...

void doSort()
{
    m_objects.quicksort(compare(*this));
}
于 2013-08-13T02:30:23.283 に答える