C ++ Как правильно добавить priority_queue в класс как атрибут с определяемым пользователем компаратором? - PullRequest
0 голосов
/ 22 сентября 2018

Я практикую использование очередей с приоритетами с пользовательским типом данных в C ++.

У меня Person.hpp как

#include <stdio.h>

class Person {
    int age;
    int height;
    int weight;
public:
    Person(int _age, int _height, int _weight);
    int getAge();
    int getHeight();
    int getWeight();
};

и Person.cpp как

#include "Person.hpp"
#include <queue>
using namespace std;

Person::Person(int _age, int _height, int _weight){
    this->age = _age;
    this->height = _height;
    this->weight = _weight;
    priority_queue<Person, vector<Person>, cmpAge > pqAge;
    priority_queue<Person, vector<Person>, cmpHeight > pqHeight;
}

int Person::getAge(){
    return this->age;
}

int Person::getHeight(){
    return this->height;
}

int Person::getWeight(){
    return this->weight;
}

class cmpAge{
public:
    int operator()(Person *a, Person *b) {
        return a->getAge() > b->getAge();
    }
};

class cmpHeight{
public:
    int operator()(Person *a, Person *b) {
        return a->getHeight() < b->getHeight();
    }
};

Вы могли видеть, что в моем Person.cpp я пытался иметь две приоритетные очереди в качестве моих атрибутов, каждая с собственным компаратором.Способ, которым я научился писать пользовательский компаратор, состоит в том, чтобы написать его как альтернативный класс и определить оператор в нем.

В этом случае я написал компаратор, пытающийся сформировать минимальную кучу для возраста человека и максимальную кучу для роста человека.

Однако, когда я пытался построитьпрограмма жалуется компилятору

Использование необъявленного идентификатора 'cmpAge'

Использование необъявленного идентификатора 'cmpHeight'

Основная причина, по которой я хочу, чтобы они были полями, заключается в том, что позже я напишу другие методы в классе Person для выполнения действий в этих очередях.

Так что же является правильным способом добавить priority_queue в класс какатрибут с пользовательским компаратором?

Спасибо, ребята!

1 Ответ

0 голосов
/ 22 сентября 2018

Во-первых, вы должны поместить компараторы перед объявлениями очередей с приоритетами.В противном случае компилятор не будет знать, что такое cmpAge и cmpHeight.Во-вторых, компараторы operator() должны получить свои аргументы const-refs и вернуть bool:

struct cmpAge {
    bool operator()(const Person& a, const Person& b) {
        return a.getAge() > b.getAge();
    }
};

Вы также должны пометить getXXX методы как const:

int getAge() const;

И в-третьих, вместо class { public: вы можете использовать struct, в котором все члены по умолчанию являются публичными.

...