次のコードは、「エラーC2248: 'A :: getMe':クラス 'A'で宣言されたプライベートメンバーにアクセスできない」とコンパイルしません。どうして?私はパブリックインターフェイスを呼び出そうとしています。Const Overloading:C++クラスのパブリック/プライベート検索
答えて
一部は、アクセシビリティと視認性がC++での独立した概念であるということです。 B& A::getMe()
プライベートメンバーは、アクセスできない場合でもmain
に表示されます。だからあなたの電話には、考慮すべき2人の過負荷会員、B& A::getMe()
とB const& A::getMe() const
があります。 a
はconst
ではないため、選択されているプライベートメンバーです。それで、アクセスできないため、エラーが発生します。プライベート非constメンバ関数がなければ、唯一の可能性としてconstメンバを持ち、constメンバとして呼び出され、非constオブジェクトに対して呼び出すことができます。
可視性がアクセシビリティに条件付けられていた場合、他の種類の混乱を招く可能性があります。メンバをリファクタリングし、クラス外のプライベートメンバにコールします。今、プライベートメンバーはアクセスできなくなり、公衆である別のメンバーに呼び出されます。その行動の静かな変化は、追跡が困難なバグにつながる可能性があります。
結論として:あなたの言語のルールは何でも、異なるアクセシビリティで過負荷になることはありません。混乱の原因となります。
非constメソッドよりもconstメソッドを呼び出すため、コンパイラが非constメソッドを選択しないようにするためには、constを指定する必要があります。
同じ名前で異なるアクセス権を持つ2つの機能が混乱するのを避けるために、プライベートメンバー関数を何か他のものに呼び出す方が簡単ではないでしょうか。
真ではありません:非constオブジェクトに対してconstメソッドを呼び出すことは、完全に合法的です(一般的です)。この場合、コンパイラが呼び出すことを決定する非constプライベートバージョンのメソッドも存在するため、混乱が生じます。 –
良いアイデア:おそらく接尾辞_iのプライベート関数に名前をつけるべきです。 –
@Martin B:これは私の意図でした。その答えが明らかになりました。それを私の注目に持ってくれてありがとう。 – Yacoby
は、a.getMe()でconstではないため、コンパイラは、メソッドのconstオーバーロードを使用しようとしていることを認識しません。あなたは(Aが初期化必要があることを除いて)期待通り
A const a;
const B& b = a.getMe();
は動作します。
C++では、戻り値の型をオーバーロードできません。その定数に基づいてメンバ関数をオーバーロードすることは例外ではありません。戻り値の型ではなく、関数が呼び出されているオブジェクトの定数にオーバーロードされます。これは奇妙で面白いですが、それはする方が簡単かもしれません。もちろん、
const B& b = const_cast<const A&>(a).getMe();
:あなたがやりたい
は const性を追加にconst_cast
を使用するには一生に一度の機会ですあなたは、このようにそれを行う場合はお読みください。他の回答に記載されなかった問題の
const A& const_a = a;
const B& b = const_a.getMe();
私はこれがなぜ落とされたのかに非常に興味があります。コメントを残すために気をつけますか? – sbi
- 1. constポインタを使用したバイナリ検索
- 2. 検索クラス。パターンアドバイスリクエスト
- 3. 検索クラス
- 4. JPA検索子クラス
- 5. Hpricot CSSクラス検索
- 6. サブライム - クラスで検索
- 7. クラス内のオブジェクトを検索
- 8. クラス内の検索方法
- 9. アンギュラ検索、複数のクラス
- 10. クラスを使用したバイナリ検索ツリー
- 11. ReSharperの検索 - 複数のクラスに
- 12. クラスリスト内のクラス要素を検索
- 13. PHP DOMのXpath - クラス名を検索
- 14. jQueryドラッグ可能クラスの検索
- 15. playframeworkの検索モジュールを使用して複数のクラスを検索する
- 16. グローバルテーブルの検索
- 17. 高速検索が可能な.NETクラス
- 18. 検索クラスを書くには?
- 19. HTML XPathクラスとテキストで検索する
- 20. 検索、完全なクラス名を返す
- 21. 休止状態検索と外部クラス
- 22. クラス名でdivを検索する
- 23. HTML XPathは、クラス名による検索
- 24. 検索フィルタと、私は4クラス持っ
- 25. 検索用の検索バー
- 26. 検索コンテナの検索ボックス
- 27. 検索コントローラの検索バーオーバーラップステータスバー
- 28. const vs new const
- 29. スタティックconstクラスのデータメンバーをチェックするスタティックアサート?
- 30. 一般的な.NETクラスのpublic static(const)
コンストラクターを除いて、 "異なるアクセシビリティで過負荷にならないでください"。技術的に公開されているデフォルトコンストラクタをオーバーロードする場合でも、プライベートコピーコンストラクタを用意するのは完全に合理的です。 – MSalters
@MSalters、コピーコンストラクタをプライベートとしてオーバーロードすると、通常は回避できます。オーバーロードしないようにしたいのですが、抑制したいと考えています。証明として:私は実装を提供しません:-)しかし、コンストラクタについてのあなたのポイントは正しいです:コンストラクタのいくつかの効果をそれらにオーバーロードせずに得ることができないので、あなたは時々選択肢がありません。すべての一般的なルールについては、例外があることになります。オペレータが提供する表記上の利便性が他者につながる可能性があります。一般に公開されたインターフェースに従うことで、あなたには良い選択が残らないかもしれません。 – AProgrammer
+1優れた説明とアドバイス! – sbi