2011-03-16 74 views
0

有一些類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)是真實的。

還有另一個類 - 隊列狀。但它應該控制其他元素的平等(含義爲==)的新推動元素。

#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;

+0

我假設el的意思是一個迭代器,你在上面的聲明中有一個錯字。如果是這樣,那麼使用'(* el)== x' ...你的迭代器沒有那個操作符定義了底層對象,如果它是與T相同的類型。如果去引用你的迭代器不起作用您的隊列聲明最有可能存在另一個問題。 – AJG85 2011-03-16 23:07:07

+0

只是一個側面說明 - 比較兩個複數應該很容易做到:'return realPart == El.realPart && imagePart == El.imagePart;'否則1將等於我,如果我沒有錯過任何東西。 – Mario 2011-03-16 23:09:24

+0

@Mario這只是一個很奇怪的樣本,不是正確的 – 2011-03-16 23:11:20

回答

2

什麼不對您在push()常量參考T但你operator==只接受非const引用。

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); 
... 
}; 

編輯:在更新的問題:

您不能分配到thisthis類型爲T * const - 因爲修改它是沒有意義的。你要做的是改變一個指向當前類的外部變量,除非這個外部變量作爲參數被傳入,否則你不能在類成員函數內部做到這一點。

我認爲你需要做哪些管理「節點」類的實例一「隊列」類 - 試圖將一個容器中混合和包含的元素是不是一個真正的好主意

而且,繼承標準庫容器中很少是一個好主意。如果你想使用std::queue然後創建一個成員變量。

1

變化:

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

到:

對未來
bool wComplex::operator==(const wComplex &El) const { 
0

一個提示:

的const關鍵字,要麼你把它不通,或到處都可以。

很明顯,無論你在哪裏都可以做得更好。