2017-10-25 7 views
3

文字列クラスを再作成しようとしていますが、2つのクラスを文字列であるかのように比較するのに問題があります。これは私がヘッダファイルに持っているものです:演算子==をオーバーロードしようとすると、2つのクラスのプライベート変数を比較する方法は?

ソースファイルで
class Mystring { 
public: 
    // ... 
private: 
    // this variable stores the memory address of the text 
    char* ptr_buffer 

    // ... 
}; 

、私はthsiコードがあります。

bool operator== (const Mystring& a, const Mystring& b) { 
    return a.ptr_buffer == b.ptr_buffer; 
} 

をしかし、何らかの理由で、私がメインで2つのMYSTRINGクラスを比較しようとします。 cpp、プライベート変数ptr_bufferにアクセスできないと言います。私はそれにアクセスできると思った?私が比較を気にする唯一のものが隠されているところで、これら2つをどのように比較すればよいでしょうか?

+0

偽のコードではなく、実際のコードを投稿してください。 C++には 'Class'キーワードはありません。なぜポインタ値を比較していますか? 2つの文字バッファの要素が等しいかどうかは分かりません。 – PaulMcKenzie

+1

等価演算子をグローバルスコープからクラスに移動します。 'public:bool operator ==(const Mystring&b){return ptr_buffer == b.ptr_buffer; } 'もちろん、あなたが本当にポインタを比較したいと仮定します。 – mnistic

答えて

1

C++言語の観点から、グローバルスコープで導入されたオーバーロードされた演算子は、グローバルスコープの他の関数と同じです(組み込み演算子の動作方法をカスタマイズする点を除けば)。通常の古いフリー関数がクラスのフィールドprivateにアクセスできないのと同じように、フリー関数のオーバーロードされた演算子は、演算子にオーバーロードしているクラスのフィールドのprivateにアクセスできません。

これを行う理由があります。たとえば、カスタムクラスではoperator <<をオーバーロードするのが普通です。一方の引数はostream参照で、もう1つはカスタムタイプです。このカスタムオーバーロードがostreamタイプのフィールドにアクセスできるのであれば、本当に悪いです!

operator ==をクラスの実装ファイルの中に定義したという事実も無関係です。 C++には、クラスが実装される方法であっても、クラスの「実装ファイル」という概念はありません。これは、すべてのソースファイルを同じ点で扱います。

この問題を解決するには、あなたがあなたのoperator ==関数がクラスのfriendであることを宣言することができます。

class MyString { 
public: 
    ... 
    friend bool operator== (const MyString& lhs, const MyString& rhs); 
} 

... 

bool operator== (const MyString& lhs, const MyString& rhs) { 
    // You were given explicit authorization to access private fields, 
    // so go right ahead! 
} 

を個別に、しかし、あなたはoperator ==の実装が正しいことを確信していますか? MyStringオブジェクトに格納されているポインタを比較していますが、指す文字列の内容ではありません。メモリ内に同じ文字列リテラルの2つの異なるコピーがある場合は、論理的に等しい(同じ文字列を表します)が2つありますが、等しいものは比較しません。

実際にoperator==は、MyStringタイプのパブリックインターフェイスを使用して実装できますか。良い文字列型では、文字列に順番にアクセスして長さを調べることができるので、答えは "yes"にする必要があります。効率の観点からは、これは理想的ではありませんが、インターフェイスが良好かどうかを確認するには良いテストです。だから、なしで実装しようと思うかもしれませんが、できるだけ確実にフィールドを使用して、operator ==friendというメリットと、パフォーマンスの観点から考えてみてください。

関連する問題