2016-06-09 2 views
1

Здравствуйте, мне нужно создать класс, который содержит поле priority_queue, функции-компараторы которого должны получить доступ к другому полю в классе. Короче мне нужно написать что-то вроде этого:Поле класса priority_queue с использованием компаратора, получающего доступ к другому полю класса

class A 
{ 
    B foo; 
    priority_queue<C,vector<C>,comparator> bar; 
} 

где определение компаратора является чем-то вроде

bool comparator(const C& c1, const C& c2) 
{ 
    //compute the boolean value using c1, c2 and the field foo 
} 

Можно ли получить этот результат в некотором роде, и где я должен определить функцию компаратора ?

+0

Используйте захватную лямбду для компаратора. –

+0

@RichardCritten уже пытался захватить лямбда ('[&]', если я прав), но это дает мне следующую ошибку: '' this 'не был захвачен для этой лямбда-функции'. Я также попытался определить автоматическое поле, хранящее лямбда-функцию, но получаю ту же ошибку. – AreTor

ответ

0

Для этого есть два шага.

Во-первых, ваш компаратор нужен конструктор, который сохраняет ссылку на экземпляр A

class comparator { 

    A &a; 

public: 
    comparator(A &a_arg) : a(a_arg) 
    { 
    } 

    bool operator()(const C &first, const C &second) const 
    { 
      // The comparator can use "a" to access the contents of the 
      // A class. 
    } 
}; 

И второй ступени для A «s конструктор для инициализации его priority_queue элемента с помощью явного comparator, который получает построенный из *this:

A::A() : bar(comparator(*this)) 
{ 
    // ... 
} 

Примечание: имейте в виду ссылку на *this в компараторе. Если экземпляр A будет скопирован, ссылка this не будет действительна в копии. Ваш класс A должен иметь либо конструктор копирования delete d, либо явный конструктор копирования, который инициализирует построенный по копиям Apriority_queue, соответственно.

+0

Если я использую этот метод, у меня есть проблема с отправкой объявления одного из двух классов, но я не могу, потому что я использую перенаправленный класс без указателя или ссылок (соответственно в методе operator() и в объявлении поля priority_queue). Должен ли я изменить ссылку A на указатель A? – AreTor

+0

Указатель или ссылка не имеет значения. Только объявляйте 'operator()' в объявлении класса 'compator', затем определяйте его после определения основного класса (с' inline'). Задача решена. –

+0

Теперь это работает, хотя мне кажется, что это немного сложно. В любом случае, спасибо за помощь, сэр. – AreTor

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