2012-04-01 3 views
0

オペレータに問題があります。一般的に私はオペレータを使う基本を知っています。しかし、私の問題は2つのオブジェクトを比較したいときに始まります。私は2つの異なるクラス宣言ファイルokrag.hとprostokat.hを持っています。私は別のクラスから2つのオブジェクトを比較します:friend bool operator>(COkrag o1, CProstokat o2);2つの異なるクラスのcompare演算子を使用する

それは言う:Error 1 error C2061: syntax error : identifier 'CProstokat'

私は考えどのような理由を持っていない、それはコンパイルを開始し、このラインを見つけたときに

//okrag.h -- circle class 
#ifndef __OKRAG_H__ 
#define __OKRAG_H__ 
#include "figura.h" 
#include "prostokat.h" 

class COkrag: public CFigura 
{ 
    protected: 
    int m_iR; 

    public: 
     COkrag(); 
     COkrag(int x, int y, int r); 
     ~COkrag(); 
     void ZmienR(int r); 
     float PodajObwod(); 
     float PodajPole(); 
     int PodajR(); 
     void operator+(int r); 
     friend void operator+(COkrag o, int x[2]); 


     bool operator>(COkrag o2); 

     friend bool operator>(COkrag o1, CProstokat o2); 

     bool operator<(COkrag o2); 
     bool operator>=(COkrag o2); 
     bool operator<=(COkrag o2); 
     friend ostream& operator << (ostream &wy, COkrag &O); 

}; 
#endif 



//prostokat.h 
#ifndef __PROSTOKAT_H__ 
#define __PROSTOKAT_H__ 
#include "figura.h" 
#include "okrag.h" 

class CProstokat: public CFigura 
{ 
    protected: 
    int m_iSz, m_iWy; 


    public: 
     CProstokat(); 
     CProstokat(int x, int y, int szer, int wys); 
     ~CProstokat(); 
     void ZmienSz(int x); 
     void ZmienWy(int y); 
     float PodajObwod(); 
     float PodajPole(); 
     void operator+(int a); 
     friend void operator+(CProstokat p, int x[2]); 

     bool operator>(CProstokat p2); 
     bool operator<(CProstokat p2); 
     bool operator>=(CProstokat p2); 
     bool operator<=(CProstokat p2); 


     friend ostream& operator << (ostream &wy, CProstokat &P); 

}; 
#endif 

私の問題がありますです。オブジェクトCProstokatを知らないようですが、このクラスの宣言を含むヘッダーファイルが含まれています。

何が問題なのか教えていただけますか?

編集: 私は自分のコードを修正しました。ここに私が得たものがあります。

bool operator>(CProstokat & p2);

をコンパイラは

Error 3 error C2662: 'CProstokat::PodajPole' : cannot convert 'this' pointer from 'const CProstokat' to 'CProstokat &'

今ではそれなしで動作言う:私は、私はそれが次のようになりたかったbool operator>(CProstokat & p2);へのconstを追加することができなかった理由を私は知りません。ここに私が得るものがある。

#ifndef __OKRAG_H__ 
#define __OKRAG_H__ 
#include "figura.h" 


class CProstokat; 

class COkrag: public CFigura 
{ 
    protected: 
    int m_iR; 

    public: 
     COkrag(); 
     COkrag(int x, int y, int r); 
     ~COkrag(); 
     void ZmienR(int r); 
     float PodajObwod(); 
     float PodajPole(); 
     int PodajR(); 
     void operator+(int r); 
     friend void operator+(COkrag o, int x[2]); 




     bool operator>(const CProstokat & p2); //I have changed it because now I can use 'this->' 
     bool operator<(CProstokat & p2); 
     bool operator>=(CProstokat & p2); 
     bool operator<=(CProstokat & p2); 

     bool operator>(COkrag o2); 
     bool operator<(COkrag o2); 
     bool operator>=(COkrag o2); 
     bool operator<=(COkrag o2); 
     friend ostream& operator << (ostream &wy, COkrag &O); 

}; 
#endif 


#ifndef __PROSTOKAT_H__ 
#define __PROSTOKAT_H__ 
#include "figura.h" 


class COkrag; 
class CProstokat: public CFigura 
{ 
    protected: 
    int m_iSz, m_iWy; 


    public: 
     CProstokat(); 
     CProstokat(int x, int y, int szer, int wys); 
     ~CProstokat(); 
     void ZmienSz(int x); 
     void ZmienWy(int y); 
     float PodajObwod(); 
     float PodajPole(); 
     void operator+(int a); 
     friend void operator+(CProstokat p, int x[2]); 

     bool operator>(COkrag& o2); 
     bool operator<(COkrag& o2); 
     bool operator>=(COkrag& o2); 
     bool operator<=(COkrag& o2); 

     bool operator>(CProstokat p2); 
     bool operator<(CProstokat p2); 
     bool operator>=(CProstokat p2); 
     bool operator<=(CProstokat p2); 


     friend ostream& operator << (ostream &wy, CProstokat &P); 

}; 
#endif 

私はあなたのアドバイスを正しく理解していただきたいと思います。答えに時間を費やしてくれてありがとう。

+3

Googleのキーワードフレーズは「*前方宣言*」です。 –

+0

また、一般的な規則は、母国語ではなく英語の識別子を使用することです。 Similaryでは、クラス名の先頭にある "C"はほとんどの時間を刺激し、コードに明瞭さをもたらしません(すべてのIDEは 'Circle'がクラスであるかどうか、「CCircle」は不要です読むことがさらに困難になります)。 – Griwes

+0

それは私の宿題であり、教師はこのタイプのCクラス宣言を必要とします。しかしアドバイスをいただきありがとうございます私は自分のプライベートプロジェクトにあなたの推奨表記スタイルを使用します。 –

答えて

0

問題は、ヘッダーファイルには、があります。です。これにより、次のシナリオが発生します。

一部のコードファイルには、procostat.hが含まれているものとします。 __PROKOSTAT_H__(サイドノード:二重下線を含むすべての識別子はインプリメンテーションのために予約されているため、独自のコードでは使用しないでください)、figura.hをインクルードして検索して処理します#include "okrag.h"。そのファイルを処理する際には、#include "prokostat.h"がコンパイルされ、にもう一度というファイルが処理されます(その時点までは、実際のコードはfigura.hの内容を除いて処理されません)。そのファイルを処理している間に、最初にインクルードガードを処理して、__PROKOSTAT_H__が既に定義されていることを確認して、でであることを了承し、#endifまでのファイルの内容を処理します。コンパイラはファイルokrag.gを処理し続けます(実際にはprokostat.hから実際のコードが1行も見付からないことを覚えておいてください)operator>という友人の定義は、CProkostatです。しかし、これまでのところ、の定義がCProkrostatであるとは見当たりませんでした。したがって、未定義の識別子について不平を言います。

これを修正する方法は?さて、最も単純な修正は、prokostat.hが実際にはokostat.hから何も参照していないことに気付くだけで、#include "okostat.h"を削除することができます。それは循環依存を壊し、したがって即座の問題を解決します。

しかし、それはまだ2つの理由で完璧な修正ではありません。まずをprokostat.hで参照する必要がある場合はどうすればよいですか?また、okrak.hから何も使用しない場合でも、okrak.hが変更されると、procostat.hを含むすべてのファイルを再コンパイルする必要があります。

したがって、正しい修正がprokostat.hから#include "okrak.h"を除去するがさらに(すなわちその定義のいずれかの前に)okrak.hから#include "prokostat.h"を削除し、代わりにそのファイルの先頭にCProkostatため前方宣言を追加するだけでなく、 。その前方宣言は次のようになります。

class CProkostat; 

これは、コンパイラはその名前のクラスが(それが不完全な型と呼ばれています)詳細のいずれかを告げず存在することを知ることができます。友人の機能を宣言するにはそのような詳細は必要ありません(に友だちの機能を定義する必要があるため、対応する実装ファイルでは#include "prokostat.h"にする必要があります)。

比較演算子は、不必要なコピーを避けるために、const参照でオブジェクトを取得する必要があります。

+0

お返事ありがとうございます。それは私にとって非常に有用なアドバイスです。私は新しいことを学びました。あなたの時間をありがとう。私は仕事に戻り、私は自分のエフェクトを投稿します。 –

1

あなたはincludeに循環依存関係があります。あなたは、okok.hの中にprostokat.hを入れています。この方法では、インクルードの1つが機能しません(ifndefのため空のファイルが作成されます)。代わりに、値によってそれらを得るためのconstの参照で引数を得るためにあなたの事業者の署名を変更、また

class CProstokat; 

:これはokrag.hの初めにクラスCProstokatの前方宣言を追加し解決するために

。これにより、パフォーマンスが向上し、フォワード宣言の使用が容易になります。

+2

彼はまた、比較演算子のパラメータとしてconst refを使用する必要があります。そうでない場合、前方宣言は機能しません。 –

+0

また、コードをもっと大きく変更することもできますが(これはこれを行う適切な方法です)、CFiguraとCProstokatの両方で動作する比較演算子を実装することができます。 – stanwise

+0

はい、それは良い解決策ですが、私は子供のクラスでのみ利用可能な機能を比較する必要があります。あなたのアドバイスを最初にテストしてからもう一度アピールします –

関連する問題