2017-03-28 20 views
6

ben şöyle operator[] aşırı biliyorum:operatör tarafından atanan değerini kontrol etmek nasıl []

T& operator [](int idx) { 
    return TheArray[idx]; 
} 

T operator [](int idx) const { 
    return TheArray[idx]; 
} 

Ama ne istediğim arr[i] = value tarafından atanan değerler kontrol etmektir. bunu yapmak için herhangi bir sözdizimi var mı 0 ile 9. olmaya değerini kontrol etmek ister misin?

+8

Bunun yerine öğeyi saran bir proxy nesnesini döndürmeniz ve bunu atamada atamayı gerçekleştirmeniz gerekir. –

+0

Kontrol ile ne demek istiyorsun? bir derleme hatası yangın istiyorsanız veya çalışma bir istisna istiyor musunuz, yoksa sessizce atama görmezden istiyorsun, yoksa kesme değerleri Menzile değilse istiyorsun musunuz? biz her zaman sınıfları hakkında ne gibi – taskinoor

+1

@taskinoor ... Biz istisnalar atmak istiyorum! – geradism

cevap

3

. Buna ek olarak, tam bir örnek. I proxy_T sınıfında, bir "kullanıcı tanımlı dönüşüm", diğer bir deyişle, operator T ilave unutmayın.

#include <iostream> 
#include <array> 
#include <stdexcept> 

template <class T> 
class myClass 
{ 
    std::array<T, 5> TheArray; // Some array... 

    class proxy_T 
    { 
     T& value; // Reference to the element to be modified 

    public: 
     proxy_T(T& v) : value(v) {} 

     proxy_T& operator=(T const& i) 
     { 
      if (i >= 0 and i <= 9) 
      { 
       value = i; 
      } 
      else 
      { 
       throw std::range_error(std::to_string(i)); 
      } 
      return *this; 
     } 

     operator T() // This is required for getting a T value from a proxy_T, which make the cout-lines work 
     { 
      return value; 
     } 
    }; 

public: 
    proxy_T operator [](int const idx) 
    { 
     return TheArray.at(idx); 
    } 

    T operator [](int const idx) const 
    { 
     return TheArray[idx]; 
    } 
}; 

int main() { 
    myClass<int> A; 

    std::cout << A[0] << std::endl; 
    A[0] = 2; 
    std::cout << A[0] << std::endl; 
    A[1] = 20; 
} 
6

Sen atama operatörü uygulamak bu şablonda (tip T) dizideki öğeye bir başvuru tutan bir şablon sınıfını yazmaya zorunda kalacak ve orada size onay uygulayabilir. Sonra bu şablon sınıfının bir nesnesini [] operatörünüzden döndürürsünüz. Böyle

şey: Rene güzel bir cevap vermiştir

template< typename T> class RangeCheck 
{ 
public: 
    RangeCheck(T& dest): mDestVar(dest) { } 
    RangeCheck& operator =(const T& new_value) { 
     if ((0 <= new_value) && (new_value < 9)) { // <= ?? 
     mDestVar = new_value; 
     } else { 
     ... // error handling 
     } 
     return *this; 
    } 
private: 
    T& mDestVar; 
}; 
İlgili konular