2013-08-13 2 views
1

я застрял этот кусок кода:станд :: Vect сортировка с переменной-члена

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 can not be static, потому что ему нужно получить доступ к переменной-члену m_objects.

Также было бы победить инкапсуляцию m_objects иметь статическую функцию и вызвать ее так

MyClass::doSort(myClass.m_objects) 

Edit

Это декларация btAlignedObjectArray

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

Линия 365 имеет декларацию или quicksort

+0

comp, как есть, не требует доступа к m_objects, поскольку вы уже передаете объекты, которые следует сравнивать друг с другом. Вы уверены, что пример завершен? –

+0

@j_schultz Извините, я пропустил важную часть кода, возможно, слишком много (или слишком мало) кофе. calculateTheNewValue() - это функция-член, необходимая для сортировки – rraallvv

+0

Показать объявление 'btAlignedObjectArray :: quickSort'. – soon

ответ

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)); 
} 
+0

Я использую Xcode 4.6, он не может распознать семантику [&] (x, y) {...}, я буду попробуйте подход-функтор – rraallvv

+0

Кстати, как он называется, он является видом блока кода, передаваемого как параметр – rraallvv

+0

@rraallvv: Вы имеете в виду, что называется этим синтаксисом? Это называется [лямбда] (http://en.wikipedia.org/wiki/Anonymous_function#C.2B.2B). –