2009-09-01 6 views

答えて

12

一部は、アクセシビリティと視認性がC++での独立した概念であるということです。 B& A::getMe()プライベートメンバーは、アクセスできない場合でもmainに表示されます。だからあなたの電話には、考慮すべき2人の過負荷会員、B& A::getMe()B const& A::getMe() constがあります。 aconstではないため、選択されているプラ​​イベートメンバーです。それで、アクセスできないため、エラーが発生します。プライベート非constメンバ関数がなければ、唯一の可能性としてconstメンバを持ち、constメンバとして呼び出され、非constオブジェクトに対して呼び出すことができます。

可視性がアクセシビリティに条件付けられていた場合、他の種類の混乱を招く可能性があります。メンバをリファクタリングし、クラス外のプライベートメンバにコールします。今、プライベートメンバーはアクセスできなくなり、公衆である別のメンバーに呼び出されます。その行動の静かな変化は、追跡が困難なバグにつながる可能性があります。

結論として:あなたの言語のルールは何でも、異なるアクセシビリティで過負荷になることはありません。混乱の原因となります。

+0

コンストラクターを除いて、 "異なるアクセシビリティで過負荷にならないでください"。技術的に公開されているデフォルトコンストラクタをオーバーロードする場合でも、プライベートコピーコンストラクタを用意するのは完全に合理的です。 – MSalters

+0

@MSalters、コピーコンストラクタをプライベートとしてオーバーロードすると、通常は回避できます。オーバーロードしないようにしたいのですが、抑制したいと考えています。証明として:私は実装を提供しません:-)しかし、コンストラクタについてのあなたのポイントは正しいです:コンストラクタのいくつかの効果をそれらにオーバーロードせずに得ることができないので、あなたは時々選択肢がありません。すべての一般的なルールについては、例外があることになります。オペレータが提供する表記上の利便性が他者につながる可能性があります。一般に公開されたインターフェースに従うことで、あなたには良い選択が残らないかもしれません。 – AProgrammer

+0

+1優れた説明とアドバイス! – sbi

3

非constメソッドよりもconstメソッドを呼び出すため、コンパイラが非constメソッドを選択しないようにするためには、constを指定する必要があります。

同じ名前で異なるアクセス権を持つ2つの機能が混乱するのを避けるために、プライベートメンバー関数を何か他のものに呼び出す方が簡単ではないでしょうか。

+0

真ではありません:非constオブジェクトに対してconstメソッドを呼び出すことは、完全に合法的です(一般的です)。この場合、コンパイラが呼び出すことを決定する非constプライベートバージョンのメソッドも存在するため、混乱が生じます。 –

+0

良いアイデア:おそらく接尾辞_iのプライベート関数に名前をつけるべきです。 –

+0

@Martin B:これは私の意図でした。その答えが明らかになりました。それを私の注目に持ってくれてありがとう。 – Yacoby

4

は、a.getMe()でconstではないため、コンパイラは、メソッドのconstオーバーロードを使用しようとしていることを認識しません。あなたは(Aが初期化必要があることを除いて)期待通り

A const a; 
const B& b = a.getMe(); 

は動作します。

8

C++では、戻り値の型をオーバーロードできません。その定数に基づいてメンバ関数をオーバーロードすることは例外ではありません。戻り値の型ではなく、関数が呼び出されているオブジェクトの定数にオーバーロードされます。これは奇妙で面白いですが、それはする方が簡単かもしれません。もちろん、

const B& b = const_cast<const A&>(a).getMe(); 

:あなたがやりたい

は const性を追加const_castを使用するには一生に一度の機会ですあなたは、このようにそれを行う場合はお読みください。他の回答に記載されなかった問題の

const A& const_a = a; 
const B& b = const_a.getMe(); 
+0

私はこれがなぜ落とされたのかに非常に興味があります。コメントを残すために気をつけますか? – sbi

関連する問題