سؤال

وفي مشروع نريد أن التفاف دفعة اسيو مقبس بطريقة ما، أن الطبقة باستخدام أو .H التفاف ليس من الضروري أن تشمل رؤوس دفعة.

ونحن عادة استخدام مؤشرات والإعلانات إلى الأمام لفئات ملفوفة.

وإعلان اعد:

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 هو في الواقع ليس مساحة الاسم، ولكن الفئة نفسها. نريد فقط استخدام فئة الداخلية على الرغم من أي أفكار؟

هل كانت مفيدة؟

المحلول

ومع أنواع الداخلية لديك الخيار الوحيد هو التفاف كل شيء. إخفاء خاصة بتطبيق مؤشرات أنفسهم داخل فئة أعلن الأمام. سيكون للمستخدمين مشاهدة فقط 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)
{ 
}

نصائح أخرى

إذا كنت تستخدم pimpl، لماذا وضع المتغيرات عضو في رأس الخاصة بك؟ ومأخذ ونقطة النهاية typedefs المستخدمة في واجهة لديك؟ إذا لم تكن جزءا من واجهة الخاص بك، وبيت القصيد للتعبير 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.

لإجابة على سؤالك المحدد، وأنواع تحاول استخدامها هي typedefs في فئة UDP اسيو، وبالتالي فإن المترجم يحتاج إلى أن ينظر إلى تعريف تلك الفئة لاستخدامه.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top