У объекта есть классификаторы типов, которые не совместимы, возможна ошибка наследования / полиморфизма? - PullRequest
0 голосов
/ 23 октября 2019
class Node
{
protected:
    int decimal_value;
    char letter;
public:
    Node(int decimal, char lett) : decimal_value(decimal), letter(lett)
    {}
    Node() :decimal_value(0), letter(NULL)
    {}
     int get_decimal()
    {
        return decimal_value;
    }
    char get_letter()
    {
        return letter;
    }
    void set_decimal(int n)
    {
        decimal_value = n;
    }
    void set_letter(char l)
    {
        letter = l;
    }
    friend bool operator<( Node& p1, Node& p2)
    {
        return p1.decimal_value > p2.decimal_value;
    }
    virtual ~Node() {};
};
class Leaf :public Node
{
    using Node::Node;

};
class Branch :public Node
{

    Node* left;
    Node* right;
public:

    Branch(Node* l, Node* r) :left(l), right(r)
    {
        decimal_value = l->get_decimal() + r->get_decimal();

    }

};
void tree_builder(priority_queue<Node> Q)
{
    Node* qleft=new Leaf;
    Node* qright= new Leaf;
    while (Q.size() > 1)
    {
        *qleft = Q.top();
        Q.pop();
        *qright = Q.top();
        Q.pop();
        Branch* b1 = new Branch(qleft, qright);
        Q.push(*b1);

        cout << Q.top().get_decimal();
    }




}

Branch и Leaf оба являются потомками Node, однако в самой последней строке, когда я пытаюсь найти начало моей очереди. «Q.top ()» дает мне ошибку «объект имеет спецификаторы типа, которые не совместимы с функцией-членом get_decimal», и я не уверен почему. Я включил Node Branch и Leaf классы.

1 Ответ

1 голос
/ 23 октября 2019

priority_queue::top() возвращает ссылку на объект const (const T &), но get_decimal() не объявляется с квалификатором const, поэтому его нельзя вызвать для объекта const. Вам необходимо добавить квалификатор const:

int get_decimal() const // <-- HERE
{
    return decimal_value;
}

Вы должны сделать то же самое для своего get_letter() геттера, также:

char get_letter() const
{
    return letter;
}

Вы также должны изменить свой operator<взять также const Node & ссылок:

friend bool operator<(const Node& p1, const Node& p2)
{
    return p1.decimal_value > p2.decimal_value;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...