2013-10-04 8 views
0

На следующем примере мне нужно определить функцию для сравнения моих объектов с использованием определенных правил в методе getHappiness (Animal *). Метод не может быть статичным и довольно сложным. Мне нужно указатель в определении сравнения, чтобы вызвать метод getHappiness.Как передать переменную объекту функции?

Итак, мой вопрос: как передать указатель на этот метод, он автоматически вызывается, когда я вставляю элемент в карту. И также не кажется, что я могу создать экземпляр структуры сравнения и передать указатель на конструктор.

Я делаю что-то неправильно? Может быть, есть альтернативный способ определения функции сравнения?

struct Compare {bool operator()(Animal* const, Animal* const) const;}; 

bool 
Compare::operator()(Animal* const a1, Animal* const a2) const { 

    Zoo* zoo; // somehow I need to get access to the Zoo instance here 

    if (zoo->getHappiness(a1) > zoo->getHappiness(a2)) return true; 
    return false; 
} 

Class Zoo(){ 
    std::multimap<Animal*, Man*, Compare> map; 

    int getHappiness(Animal*); // cannot be static 

} 

int main(){ 
... 
    Zoo zoo; 
    zoo.map.insert(...); 
... 
} 
+0

Вы можете сделать его параметром шаблона для вашего функтора 'Compare'. Я не думаю, что имеет смысл иметь возможность предоставлять значение времени выполнения для пользовательского Compare на 'std :: multimap' в любом случае. – goji

+0

вернуть счастье от животных не из зоопарка, должно сделать ваш код намного проще. – billz

+0

@billz: Я знал, но ему нужно так много вещей из основного (в реальном коде), так что в конечном итоге нужно будет передавать гораздо больше ценностей животному. Можете рассмотреть это снова, если ничего не работает. – msgmaxim

ответ

1

В вашем коде есть проблема с дизайном. Happiness должен быть атрибутом, который относится к animal, а не к zoo. Так реализовать getHappiness() на animal делает ваш код намного проще:

struct Compare 
{ 
    bool operator()(Animal& const, Animal& const) const; 
}; 

bool Compare::operator()(Animal& const a1, Animal& const a2) const 
{ 
    return a1.getHappiness() < a2.getHappiness(); 
} 

Class Zoo(){ 
    std::multimap<Animal, Man, Compare> map; 

} 

Кроме того, если нет необходимости, не используйте указатель. Если вы не можете избежать указателей, используйте смарт-указатель в контейнере STL.

+0

Не похоже, что у меня есть другие варианты, но я бы добавил еще больше вопросов, о которых я упомянул в своем комментарии. Спасибо, в любом случае! – msgmaxim

+0

написать небольшой класс, простые функции, сэкономит вам жизнь :) – billz

Смежные вопросы