English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

تعليمية C++ الأساسية

تحكم في العملية C++

وظائف C++

مجموعات C++ و 字وائم

هياكل بيانات C++

تصنيفات C++ و كائنات

المراجع C++

التنسيق C++

تعليمية STL C++

دليل مرجعي C++

تعديل عمودي التوجيه -> في تصنيف C++

تحميل العمليات والوظائف C++

يمكن تعريف عمودي التوجيه -> كعمودي سكفي قابل للتعديل، ولكن يعتبر أكثر تعقيدًا. يتم تعريفه لمنح التصنيف "سلوك المؤشر". يجب أن يكون عمودي التوجيه -> دالة عضوية. إذا تم استخدام عمودي التوجيه ->، يجب أن يكون نوع العودة هو مؤشر أو كائن من التصنيف.

يستخدم عمودي التوجيه -> عادةً مع عمودي التوجيه * لتشكيل "مؤشر ذكاء". هذه المؤشرات هي كائنات تتصرف بشكل مشابه للمؤشرات العادية، ولكن الفرق هو أن عندما يتم الوصول إلى الكائن عبر المؤشر، ستقوم بتنفيذ مهام أخرى. مثل، عند إزالة المؤشر أو عند توجيه المؤشر إلى كائن آخر، سيتم إزالة الكائن تلقائيًا.

يمكن تعريف عمودي التوجيه -> كعمودي سكفي بعدي. أي أن يتم تقديم تصنيف:

class Ptr{
   //...
   X * operator->();
};

التصنيف Ptr الذي يمكن استخدامه لتحديد الكائن X المساهمات، يتم استخدامها بنفس الطريقة التي يتم استخدامها للإشارات. على سبيل المثال:

void f(Ptr p)
{
   p->m = 10; // (p.operator->())->m = 10
}

تُفسر جملة p->m على أنها (p.operator->())->m. وبالمثل، يوضح المثال التالي كيفية إعادة تعريف عمليات الوصول إلى أعضاء الفئة ->.

#include <iostream>
#include <vector>
using namespace std;
 
// افتراض فئة حقيقية
class Obj {
   static int i, j;
public:
   void f() const { cout << i++ << endl; }
   void g() const { cout << j++ << endl; }
};
 
// تعريف أعضاء ثابتة
int Obj::i = 10;
int Obj::j = 12;
 
// تحقيق حاوية للفئات أعلاه
class ObjContainer {
   vector<Obj*> a;
public:
   void add(Obj* obj)
   { 
      a.push_back(obj); // استدعاء طريقة القائمة القياسية
   }
   friend class SmartPointer;
};
 
// تحقيق محول ذكاء، للاستفادة من أعضاء فئة Obj
class SmartPointer {
   ObjContainer oc;
   int index;
public:
   SmartPointer(ObjContainer& objc)
   { 
       oc = objc;
       index = 0;
   }
   // يعكس القيمة المقدمة
   bool operator++() // النسخة المسبقة
   { 
     if(index >= oc.a.size() - 1) return false;
     if(oc.a[++index] == 0) return false;
     return true;
   }
   bool operator++(int) // النسخة المتممة
   { 
      return operator++();
   }
   // إعادة تعريف عمليات ->
   Obj* operator->() const 
   {
     if(!oc.a[index])
     {
        cout << "Zero value";
        return (Obj*)0;
     }
     return oc.a[index];
   }
};
 
int main() {
   ثابت int sz = 10;
   Obj o[sz];
   ObjContainer oc;
   للمقارنة int i = 0; i < sz; i++)
   {
       oc.add(&o[i]);
   }
   SmartPointer sp(oc); // إنشاء مبدأ
   do {
      sp->f(); // استدعاء مرجع الذكاء
      sp->g();
   }
   return 0;
}

عندما يتم ترجمة وكتابة الكود أعلاه، سيتم إنتاج النتيجة التالية:

10
12
11
13
12
14
13
15
14
16
15
17
16
18
17
19
18
20
19
21

تحميل العمليات والوظائف C++