سؤال

والحقيقة، لدي سؤال تصميم هنا. دورته بسيطة جدا ولكن النقطة المهمة هي:

ولدي فئة واحدة C ++ التي تحتوي على ناقل STL أعلن كعضو الخاص. لكن عملاء تلك الفئة تحتاج إلى تكرار عبر هذه النواقل.

في C # لدينا بيان مفيد جدا، والغلة، وذلك في حالات من هذا القبيل، أن تكتب وظيفة عودته إلى IEnumerable و"غلة" لك طريقة لطيفة لتكرار عبر حاوية خاصة داخل تلك الفئة.

وأنا مجرد محاولة لإيجاد حل أنيق لC ++، بدلا من استخدام أساليب مثل GetValue (الباحث IDX).

وأي اقتراحات؟

مثال:

class Fat
{
   public:
      Fat();
   // some code here ...

   private:
      void LoadSectors(SECT startPoint);
      std::vector<SECT>sectors;

};

class Storage
{
   public:
      Storage(string CompoundFile);

      //For example, this method will receive a ref to my fat system and iterate over
      //the fat array in order to read every sector. 
      LoadStrem(Fat& fat);

};

وهذا مثال بسيط حتى الآن.

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

المحلول

وليس هناك نحوي السكر في C ++ مماثلة لyield في C #. إذا كنت ترغب في إنشاء فئة، يجب أن الحالات التي يكون iterable بنفس الطريقة مجموعات الأسهم STL هي، ثم لديك لتنفيذ مكرر للفئة الخاصة بك، كشف أنها ::iterator على نوع، وتوفير وظائف begin() وعضو end().

نصائح أخرى

ويمكنك إما إنشاء وظيفة استرجاع والتي ترجع إشارة (أو إشارة يفضل CONST) للناقلات، أو يمكنك إنشاء وظائف begin() واسترجاع end() التي تعود المكررات ناقلات المناسبة.

وانه لامر مؤلم دائما عند الحاجة إلى نشر أحشاء صفك ...

وأنت قد تكون قادرة على حل هذه المشكلة من خلال توفير الخوارزميات المحكمة الخاصة بلبنان لا: توفر وظيفة foreach على واجهة الكائن

class S { 
   std::vector<int> v;

public:
   //... and some methods to populate the vector

   template< typename F > F& foreach( F& f ) { 
      return std::for_each( v.begin(), v.end(), f );
   }

};

وبهذه الطريقة، لا تزال الطبقة "مغلقة"، ولكن لديك المرونة التي تحتاج إليها. يمكنك أيضا إضافة وظيفة copy، وربما transform. هؤلاء هم I معظم الأحيان تحتاج إليها.

واسمحوا صفك تعرض التكرارات.

class Fat
{
   public:
    typedef std::vector<SECT>::iterator iterator;

    iterator begin() { return sectors.begin(); }
    iterator end() { return sectors.end(); }

      Fat();
   // some code here ...

   private:
      void LoadSectors(SECT startPoint);
      std::vector<SECT>sectors;

ثم رمز المحيطة يمكن اجتياز عناصر مكافحة ناقلات بحرية من خلال مجرد زوج من التكرارات.

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