Latest web development tutorials

C ++ Operator dostępu członkiem klasy -> Odśwież

Funkcja C ++ przeciążenie i przeciążanie operatorów Funkcja C ++ przeciążenie i przeciążanie operatorów

Operator dostępu członkiem klasy (->) może być przeciążony, ale jest to uciążliwe. Jest ona definiowana dla danej klasy "wskaźnik" zachowania. Operator -> musi być funkcją członkiem. Jeśli używasz -> operator, rodzaj powrotu musi być wskaźnikiem lub klasy obiektów.

Operator -> jest zwykle operator wyłuskiwania * wskaźnik stosuje się w połączeniu z, na realizacji funkcji "inteligentne" wskaźnika. Te wskaźniki są wskaźnikami zachowują się jak normalne obiekty, jedyną różnicą jest to, że kiedy przekazać wskaźnik dostępu do obiektu, oni wykonywać inne zadania. Na przykład, jeśli wskaźnik jest zniszczony lub gdy wskaźnik do innego przedmiotu, przedmiot zostanie automatycznie usunięty.

Pośrednie odniesienia operator -> może być zdefiniowana jako jednoargumentowy operator postfix. Oznacza to, że dana klasa:

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

Ptr klasa obiektów może być stosowany w celu uzyskania dostępu do członka klasy X,wykorzystanie rozwiązania wskaźnika jest bardzo podobne. Na przykład:

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

Oświadczenie p> m jest interpretowane jako (p.operator -> ()) -> m. Podobnie Poniższy przykład ilustruje sposób, aby przeładować operator dostępu członkiem klasy ->.

#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()) 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() {
   const int sz = 10;
   Obj o[sz];
   ObjContainer oc;
   for(int i = 0; i < sz; i++)
   {
       oc.add(&o[i]);
   }
   SmartPointer sp(oc); // 创建一个迭代器
   do {
      sp->f(); // 智能指针调用
      sp->g();
   } while(sp++);
   return 0;
}

Gdy powyższy kod jest kompilowany i wykonany, że daje następujące wyniki:

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

Funkcja C ++ przeciążenie i przeciążanie operatorów Funkcja C ++ przeciążenie i przeciążanie operatorów