Frage

in einem Projekt, das wir den Boost-Asio-Buchse in einer Art und Weise wickeln möchten, dass die Verwendung von Klasse oder die Verpackung .h muss nicht die Boost-Header enthalten.

Wir verwenden in der Regel Zeiger und Vorwärtsdeklarationen für verpackte Klassen.

Foward Erklärung:

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

Und dann erklärt die Fassung:

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

(Wenn Sie nicht scoped_ptr wissen, ignoriert es, das Problem mit einem Standard * Zeiger gleich ist.)

Aber das gibt einen Compiler-Fehler:

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

Ich verstehe, ist dies, weil udp eigentlich keinen Namensraum, sondern eine Klasse selbst. Wir wollen nur wenn die innere Klasse verwenden, irgendwelche Ideen?

War es hilfreich?

Lösung

Mit Innen Typen Ihre einzige Option alles wickelt. Verstecken scoped Zeiger sich in einer Vorwärts-deklarierten Klasse. Benutzer würden nur Ihre API sehen und Ihre eigenen Objekte anstelle von boost Objekte laufen um.

In Ihrem Beispiel wenn wie Erklärungen Privat Mitglied suchen scoped_ptr, können Sie mit einfachen wegkommen:

// 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)
{ 
}

Andere Tipps

Wenn Sie Pimpl verwenden, warum setzen Sie Elementvariablen in Ihrem Header? Ist die Buchse und Endpunkt typedefs in Ihrer Schnittstelle verwendet? Wenn sie der ganze Sinn des Pimpl Idioms nicht Teil Ihrer Schnittstelle ist, ist, dass Sie nicht die Elementvariablen einer Klasse in der Header-Datei definieren; sie sind Implementierungsdetails.

ich so etwas wie dies in der Header-Datei erwarten:

// ...

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

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

Und dann in der Implementierung-Datei:

#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.

Ihre Frage zu beantworten, die Typen, die Sie versuchen, zu verwenden sind typedefs in der Asio udp Klasse, so dass der Compiler muss die Definition dieser Klasse haben gesehen, es zu benutzen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top