0

プロジェクトでは、使用クラスまたはラッピング .h にブースト ヘッダーを含める必要がないように、Boost Asio ソケットをラップしたいと考えています。

通常、ラップされたクラスにはポインターと前方宣言を使用します。

前方宣言:

namespace boost
{
  namespace asio
  {
    namespace ip
    {
      class udp;
    }
  }
}

次に、ソケットを宣言します。

  scoped_ptr<boost::asio::ip::udp::socket> socket_;
  scoped_ptr<boost::asio::ip::udp::endpoint> receiveEp_;

(scoped_ptr がわからない場合は無視してください。問題は標準の * ポインターと同じです。)

しかし、これによりコンパイラエラーが発生します。

error C2027: use of undefined type 'boost::asio::ip::udp'

これは、udp が実際には名前空間ではなく、クラス自体であるためだと理解しています。ただし、内部クラスのみを使用したいのですが、何かアイデアはありますか?

4

2 に答える 2

3

pimplを使用している場合、なぜヘッダーにメンバー変数を配置するのですか?インターフェイスでソケットとエンドポイントのtypedefが使用されていますか?それらがインターフェースの一部でない場合、pimplイディオムの要点は、ヘッダーファイルでクラスのメンバー変数を定義しないことです。それらは実装の詳細です。

私はヘッダーファイルに次のようなものを期待しています:

// ...

class MyClass {
public:
    MyClass();
    // .. Other member functions

private:
    struct Imp;
    boost::shared_ptr<Imp> m_imp;   // This is the only member variable.
};

そして、実装ファイルで:

#include <boost/asio/whatever.hpp>

struct MyClass::Imp
{
    scoped_ptr<boost::asio::ip::udp::socket> socket_;
    scoped_ptr<boost::asio::ip::udp::endpoint> receiveEp_;

    // Remainder of implementation class ...
};

// Other implementation details.

特定の質問に答えるために、使用しようとしている型はasio udpクラスのtypedefであるため、コンパイラーはそれを使用するためにそのクラスの定義を確認する必要があります。

于 2009-10-28T03:35:01.720 に答える
2

内部タイプでは、唯一のオプションはすべてをラップすることです。前方宣言されたクラス内にスコープポインター自体を非表示にします。ユーザーはAPIのみを表示し、ブーストオブジェクトの代わりに独自のオブジェクトを渡します。

あなたの例では、scoped_ptrはプライベートメンバー宣言のように見えますが、簡単に回避できます。

// header
class SomeClass 
{ 
public:
    SomeClass();
    // stuff   
private: 
    scoped_ptr<class pimpl_bla> _m; 
};

// source
class pimpl_bla
{
public: 
    scoped_ptr<boost::asio::ip::udp::socket> socket_;
};

SomeClass::SomeClass() 
    :_m(new pimpl_bla)
{ 
}
于 2009-10-28T03:35:41.203 に答える