17

この質問autoでは、プライベート タイプを次のように公開する理由について説明しました。

#include <iostream>

using namespace std;

class Base {

  class PrivateClass {    
  public: 
    void bar() { cout << "PrivateClass" << endl; }
  };

public:

  PrivateClass foo() {
    PrivateClass a;
    return a;
  }

};

int main() {

  Base b;
  auto p = b.foo();
  p.bar();
  return 0;
}

C++11標準では完全に問題ありません。私がまだ得ていないのは、このイディオムが実際のアプリケーションでどのように役立つかということです。 このイディオムを効果的に使用できる問題はありますか、それともキーワードの「奇妙な」副作用と見なす必要がありますか?

4

2 に答える 2

10

戻り値のタイプが指定されていない場合に役立ちます。たとえば、、std::bindまたは以前の呼び出しから返されたオブジェクトboost::bindは指定されていません。これは実装で定義されたファンクターですが、実装の詳細を見ずに実際にそのタイプを知ることはできません。C ++ 11のautoキーワードの前boost::functionに、の結果を格納するための変数型として使用するか、テンプレート引数をとる関数にbind結果を渡すことができます。bindC ++ 11では、を使用して結果オブジェクトを格納できますauto

したがって、クラスに内部型がある場合は、実際の型をパブリックAPIに公開する必要はありません。クラスのユーザーはautoキーワードを使用するだけで、APIドキュメントにはタイプが「未指定」であると記載されています。これにより、実際の内部タイプがプライベート実装の詳細に保たれ、カプセル化が改善されることがよくあります。

于 2012-12-04T18:45:53.773 に答える
1

「auto」キーワードとサブクラス化がそのような機能を提供するかどうかにかかわらず、「プライベート型」の概念は実用的ではないようです。

OOP の前は、一部の開発者は (void*) ポインターを使用して「構造体」への型を隠していました。さらに更新された別のケースでは、特定のクラスのオブジェクトを許可し、スーパークラスによってのみ公開されました。

于 2012-12-04T19:02:21.540 に答える