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
というメリットと、パフォーマンスの観点から考えてみてください。
偽のコードではなく、実際のコードを投稿してください。 C++には 'Class'キーワードはありません。なぜポインタ値を比較していますか? 2つの文字バッファの要素が等しいかどうかは分かりません。 – PaulMcKenzie
等価演算子をグローバルスコープからクラスに移動します。 'public:bool operator ==(const Mystring&b){return ptr_buffer == b.ptr_buffer; } 'もちろん、あなたが本当にポインタを比較したいと仮定します。 – mnistic