проблема с оператором `==` - PullRequest
0 голосов
/ 17 марта 2011

Существует некоторый класс wComplex с оператором ==.

#ifndef WCOMPLEX_H
#define WCOMPLEX_H

#include <stdio.h>

// sample class of complex-like numbers with weird `==` operator
class wComplex{
private:
    double realPart;
    double imagePart;

public:
    wComplex();
    wComplex(double R);
    wComplex(double R, double I);
    bool operator==(wComplex &);
    void print();
};

wComplex::wComplex(){
    realPart  = 0;
    imagePart = 0;
}

wComplex::wComplex(double R){
    realPart  = R;
    imagePart = 0;
}

wComplex::wComplex(double R, double I)
{
    realPart  = R;
    imagePart = I;
}

bool wComplex::operator==(wComplex &El){
    double diff = realPart*realPart + imagePart*imagePart - 
    El.realPart*El.realPart - El.imagePart*El.imagePart;
    return (diff == 0);
}

void wComplex::print(){
    printf("(%g) + (%g)i\n", realPart, imagePart);
}   

#endif

Он успешно работал с такими вещами:

wComplex A(1, 2);
wComplex B(2, 4);
wComplex C(2, 1);

(A == C) true1008 *

Есть еще один класс - очереди.Но он должен контролировать новый отправленный элемент на предмет равенства (в смысле ==) других элементов.

#ifndef MYQueue_H
#define MYQueue_H

#include <stdio.h>
#include <queue>


template<typename T>

class myQueue : public std::queue<T>{

public:

    myQueue(){
        printf("new myQueue successfully created\n");
    }

    void push (const T& x){
        myQueue* tmp = new myQueue;
        myQueue* old = new myQueue;
        old = this;
        bool MATCH = false;

        while(!old->empty()){
            T el = old->front();
            if(el == x){
                MATCH = true;
                tmp->push(x);
            }
            else
                tmp->push(el);
            old->pop();
        }
        if(!MATCH)
            tmp->push(x);
        this = *tmp;
        delete tmp;
        delete old;
    }

};

#endif

Итак, теперь есть одна проблема

myqueue.h: In member function ‘void myQueue<T>::push(const T&) [with T = wComplex]’:
shit.cpp:23:   instantiated from here
myqueue.h:26: error: no match for ‘operator==’ in ‘el == x’
wcomplex.h:36: note: candidates are: bool wComplex::operator==(wComplex&)
myqueue.h:36: error: lvalue required as left operand of assignment
make: *** [compile] Error 1

На самом деле, я могуне понимаю, почему no match for ‘operator==’ in ‘el == x’ А что мне делать?Есть идеи

UPD: а как заменить элемент this на tmp?Что-то не так с this = *tmp;

Ответы [ 3 ]

2 голосов
/ 17 марта 2011

У вас есть const ссылка на T в push(), но ваш operator== принимает только неконстантные ссылки.

bool wComplex::operator==(wComplex &El)

должно быть

bool wComplex::operator==(wComplex const &El) const

Или, оптимально, ваша operator== должна быть бесплатной функцией:

bool operator==(wComplex const & Left, wComplex const & Right) {
}

Если вам не нужен внешний доступ к переменным-членам wComplex, вам нужно сделать операторфункция друга:

class wComplex {
...
    friend bool operator==(wComplex const & Left, wComplex const & Right);
...
};

РЕДАКТИРОВАТЬ: В обновленном вопросе:

Вы не можете назначить this.this имеет тип T * const - так как его не имеет смысла изменять.То, что вы пытаетесь сделать, это изменить внешнюю переменную, которая указывает на текущий класс, вы не можете сделать это изнутри функции-члена класса, если эта внешняя переменная не передана в качестве аргумента.

Я думаю, вынеобходимо создать класс «очередь», который управляет экземплярами класса «узел» - попытка объединить контейнер и содержащиеся в нем элементы не очень хорошая идея

Кроме того, наследование контейнеров стандартной библиотеки редко является хорошей идеей.Если вы хотите использовать std::queue, создайте переменную-член.

1 голос
/ 17 марта 2011

Изменение:

bool wComplex::operator==(wComplex &El){

в

bool wComplex::operator==(const wComplex &El) const {
0 голосов
/ 17 марта 2011

Один совет на будущее:

Ключевое слово const, либо вы его нигде не используете, либо везде, где можете.

Очевидно, что везде, где ты можешь, лучше.

...