SafeInt sınıfı
Tamsayı taşması önlemeye yardımcı olmak için tamsayı ilkel genişletir ve, farklı türde tamsayılar karşılaştırmanızı sağlar.
template<typename T, typename E = _SAFEINT_DEFAULT_ERROR_POLICY>
class SafeInt;
Parametreler
Şablon |
Description |
---|---|
T |
Tamsayı veya Boole parametresi türü, SafeInt yerini alır. |
E |
İlke işleme hatasını tanımlayan bir numaralandırılmış veri türü. |
U |
Tamsayı veya Boole parametresi için ikinci işlenenin türü. |
Parametre |
Description |
---|---|
rhs [in] |
Bir girdi parametresini tek başına birkaç işlevlerinde işlecinin sağ tarafındaki değeri temsil eder. |
[de] ı |
Bir girdi parametresini tek başına birkaç işlevlerinde işlecinin sağ tarafındaki değeri temsil eder. |
bit] |
Bir girdi parametresini tek başına birkaç işlevlerinde işlecinin sağ tarafındaki değeri temsil eder. |
Üyeler
Ortak Oluşturucusu
Ad |
Description |
---|---|
Varsayılan Oluşturucu. |
Atama operatörleri
Ad |
Sözdizimi |
---|---|
= |
template<typename U> SafeInt<T,E>& operator= (const U& rhs) |
= |
SafeInt<T,E>& operator= (const T& rhs) throw() |
= |
template<typename U> SafeInt<T,E>& operator= (const SafeInt<U, E>& rhs) |
= |
SafeInt<T,E>& operator= (const SafeInt<T,E>& rhs) throw() |
Atama operatörleri
Ad |
Sözdizimi |
---|---|
bool |
operator bool() throw() |
char |
operator char() const |
imzalı char |
operator signed char() const |
unsigned char |
operator unsigned char() const |
__int16 |
operator __int16() const |
İmzasız __int16 |
operator unsigned __int16() const |
__int32 |
operator __int32() const |
İmzasız __int32 |
operator unsigned __int32() const |
long |
operator long() const |
imzasız uzun |
operator unsigned long() const |
__int64 |
operator __int64() const |
unsigned __int64 |
operator unsigned __int64() const |
wchar_t |
operator wchar_t() const |
Karşılaştırma işleçleri
Ad |
Sözdizimi |
---|---|
< |
template<typename U> bool operator< (U rhs) const throw() |
< |
bool operator< (SafeInt<T,E> rhs) const throw() |
>= |
template<typename U> bool operator>= (U rhs) const throw() |
>= |
Bool operator>= (SafeInt<T,E> rhs) const throw() |
> |
template<typename U> bool operator> (U rhs) const throw() |
> |
Bool operator> (SafeInt<T,E> rhs) const throw() |
<= |
template<typename U> bool operator<= (U rhs) const throw() |
<= |
bool operator<= (SafeInt<T,E> rhs) const throw() |
== |
template<typename U> bool operator== (U rhs) const throw() |
== |
bool operator== (bool rhs) const throw() |
== |
bool operator== (SafeInt<T,E> rhs) const throw() |
!= |
template<typename U> bool operator!= (U rhs) const throw() |
!= |
bool operator!= (bool b) const throw() |
!= |
bool operator!= (SafeInt<T,E> rhs) const throw() |
Aritmetik işleçler
Ad |
Sözdizimi |
---|---|
+ |
const SafeInt<T,E>& operator+ () const throw() |
- |
SafeInt<T,E> operator- () const |
++ |
SafeInt<T,E>& operator++ () |
-- |
SafeInt<T,E>& operator-- () |
% |
template<typename U> SafeInt<T,E> operator% (U rhs) const |
% |
SafeInt<T,E> operator% (SafeInt<T,E> rhs) const |
%= |
template<typename U> SafeInt<T,E>& operator%= (U rhs) |
%= |
template<typename U> SafeInt<T,E>& operator%= (SafeInt<U, E> rhs) |
* |
template<typename U> SafeInt<T,E> operator* (U rhs) const |
* |
SafeInt<T,E> operator* (SafeInt<T,E> rhs) const |
*= |
SafeInt<T,E>& operator*= (SafeInt<T,E> rhs) |
*= |
template<typename U> SafeInt<T,E>& operator*= (U rhs) |
*= |
template<typename U> SafeInt<T,E>& operator*= (SafeInt<U, E> rhs) |
/ |
template<typename U> SafeInt<T,E> operator/ (U rhs) const |
/ |
SafeInt<T,E> operator/ (SafeInt<T,E> rhs ) const |
/= |
SafeInt<T,E>& operator/= (SafeInt<T,E> i) |
/= |
template<typename U> SafeInt<T,E>& operator/= (U i) |
/= |
template<typename U> SafeInt<T,E>& operator/= (SafeInt<U, E> i) |
+ |
SafeInt<T,E> operator+ (SafeInt<T,E> rhs) const |
+ |
template<typename U> SafeInt<T,E> operator+ (U rhs) const |
+= |
SafeInt<T,E>& operator+= (SafeInt<T,E> rhs) |
+= |
template<typename U> SafeInt<T,E>& operator+= (U rhs) |
+= |
template<typename U> SafeInt<T,E>& operator+= (SafeInt<U, E> rhs) |
- |
template<typename U> SafeInt<T,E> operator- (U rhs) const |
- |
SafeInt<T,E> operator- (SafeInt<T,E> rhs) const |
-= |
SafeInt<T,E>& operator-= (SafeInt<T,E> rhs) |
-= |
template<typename U> SafeInt<T,E>& operator-= (U rhs) |
-= |
template<typename U> SafeInt<T,E>& operator-= (SafeInt<U, E> rhs) |
Mantıksal işleçler
Ad |
Sözdizimi |
---|---|
! |
bool operator !() const throw() |
~ |
SafeInt<T,E> operator~ () const throw() |
<< |
template<typename U> SafeInt<T,E> operator<< (U bits) const throw() |
<< |
template<typename U> SafeInt<T,E> operator<< (SafeInt<U, E> bits) const throw() |
<< = |
template<typename U> SafeInt<T,E>& operator<<= (U bits) throw() |
<< = |
template<typename U> SafeInt<T,E>& operator<<= (SafeInt<U, E> bits) throw() |
>> |
template<typename U> SafeInt<T,E> operator>> (U bits) const throw() |
>> |
template<typename U> SafeInt<T,E> operator>> (SafeInt<U, E> bits) const throw() |
>> = |
template<typename U> SafeInt<T,E>& operator>>= (U bits) throw() |
>> = |
template<typename U> SafeInt<T,E>& operator>>= (SafeInt<U, E> bits) throw() |
& |
SafeInt<T,E> operator& (SafeInt<T,E> rhs) const throw() |
& |
template<typename U> SafeInt<T,E> operator& (U rhs) const throw() |
& = |
SafeInt<T,E>& operator&= (SafeInt<T,E> rhs) throw() |
& = |
template<typename U> SafeInt<T,E>& operator&= (U rhs) throw() |
& = |
template<typename U> SafeInt<T,E>& operator&= (SafeInt<U, E> rhs) throw() |
^ |
SafeInt<T,E> operator^ (SafeInt<T,E> rhs) const throw() |
^ |
template<typename U> SafeInt<T,E> operator^ (U rhs) const throw() |
^= |
SafeInt<T,E>& operator^= (SafeInt<T,E> rhs) throw() |
^= |
template<typename U> SafeInt<T,E>& operator^= (U rhs) throw() |
^= |
template<typename U> SafeInt<T,E>& operator^= (SafeInt<U, E> rhs) throw() |
| |
SafeInt<T,E> operator| (SafeInt<T,E> rhs) const throw() |
| |
template<typename U> SafeInt<T,E> operator| (U rhs) const throw() |
|= |
SafeInt<T,E>& operator|= (SafeInt<T,E> rhs) throw() |
|= |
template<typename U> SafeInt<T,E>& operator|= (U rhs) throw() |
|= |
template<typename U> SafeInt<T,E>& operator|= (SafeInt<U, E> rhs) throw() |
Notlar
SafeInt Karşı matematiksel işlemler tamsayı taşması class korur. Örneğin, iki 8 bitlik tamsayılar eklemeyi düşünün: bir değeri 200 ve ikinci 100 değeri vardır. Doğru matematiksel işlem olurdu 200 + 100 = 300. Ancak, 8-bit tamsayı sınırı nedeniyle üst bit kaybolur ve derleyici 44 döndürecektir (300-28) sonucu olarak. Bu matematiksel denklem üzerinde bağlıdır herhangi bir işlem beklenmeyen davranış üretecektir.
SafeInt Sınıf kodu olup sıfıra çalışır veya olup aritmetik taşma oluşur denetler. Her iki durumda da, olası sorunu program uyarmak için hata işleyicisi sınıfı çağırır.
Bu sınıf Ayrıca, iki farklı türde tamsayılar oldukları sürece karşılaştırmanızı sağlar SafeInt nesneler. Genellikle, bir karşılaştırma yaptığınızda sayıları aynı türde olması önce dönüştürmeniz gerekir. Genellikle bir sayıyı başka bir türüne çevrim, hiçbir veri kaybı olduğundan emin olmak için denetler gerektirir.
Matematik ve karşılaştırma işleçleri tarafından desteklenen işleçleri tabloda bu konudaki SafeInt sınıfı. En matematiksel işleçler dönmek bir SafeInt nesne türü T.
Karşılaştırma işlemleri arasında bir SafeInt ve her iki yönde tamsayı türü gerçekleştirilebilir. Örneğin, hem de SafeInt<int>(x) < y ve y > SafeInt<int>(x) geçerli olduğunu ve aynı sonucu verecektir.
Birçok ikili işleçler, iki farklı desteklemeyen SafeInt türleri. Bunun bir örneği & işleci. SafeInt<T, E> & intdesteklenir, ancak SafeInt<T, E> & SafeInt<U, E> değil. İkinci örnekte, derleyici parametresi dönmek için ne tür bilmez. Bu sorunun bir çözümü, ikinci parametre taban tipine artığını sağlamaktır. Aynı parametreleri kullanarak bu ile yapılabilir SafeInt<T, E> & (U)SafeInt<U, E>.
Not
Bitsel herhangi bir işlem için iki değişik parametrelerle aynı boyutta olması gerekir.Boyutları farklıysa, derleyici yaratacak bir ASSERT (MFC) özel durum.Bu işlemin sonuçları doğru olması garanti edilemez.Bu sorunu çözmek için daha büyük parametresi ile aynı boyutta oluncaya kadar küçük parametre artığını.
Kaydırma işleçleri için şablon türü için mevcut olandan daha fazla bit kaydırma, onaylama işlemi özel durum oluşturur. Bu yayın modunda hiçbir etkisi olmaz. İki tür parametreleri SafeInt karıştırma dönüş türü özgün türü ile aynı olduğu için kaydırma operatörleri için mümkündür. Sağ tarafındaki işleci yalnızca kaydırmak için kullanılan bit sayısını gösterir.
Bir SafeInt nesnesi ile mantıksal bir karşılaştırma yaptığınızda karşılaştırma kesinlikle aritmetik. Örneğin, bu ifadeler göz önünde bulundurun:
SafeInt<uint>((uint)~0) > -1
((uint)~0) > -1
İlk ifade çözümler true, ancak ikinci ifade çözümler false. Bitsel Negatiflik 0 olarak 0xFFFFFFFF kullanılır. İkinci ifade varsayılan karşılaştırma işleci 0xFFFFFFFF olarak 0xFFFFFFFF karşılaştırır ve bunları eşit olduğunu varsayar. Karşılaştırma işleci için SafeInt sınıfı, birinci parametre imzasız iken, ikinci parametre negatif olabileceğinin farkındadır. Bu nedenle, bit gösterimine aynıdır, ancak SafeInt mantıksal işleç olabileceğinin farkındadır işaretsiz tamsayı -1'den büyükse.
Siz kullanırken dikkatli olun SafeInt ile birlikte sınıf ?: Üçlü operatör. Aşağıdaki kod satırını düşünün.
Int x = flag ? SafeInt<unsigned int>(y) : -1;
Derleyici onu şuna dönüştürür:
Int x = flag ? SafeInt<unsigned int>(y) : SafeInt<unsigned int>(-1);
flag Olan false, derleyici -1 değeri atamak yerine bir özel durum oluşturduğunda x. Bu nedenle, bu davranışı engellemek için kullanmak üzere doğru aşağıdaki satırı kodudur.
Int x = flag ? (int) SafeInt<unsigned int>(y) : -1;
Tve U Boolean türü, karakter tür ya da tamsayı türü atanır. Tür imzalanmış veya imzalanmamış tamsayı ve herhangi bir boyuta 8 bitten 64 bittir.
Not
Ancak SafeInt sınıfı her türlü tamsayı kabul eder, imzasız türlerini daha verimli bir şekilde gerçekleştirir.
Emekanizması işleme hatası, SafeInt kullanır. İki hata işleme mekanizmaları ile SafeInt kitaplığı sağlanmıştır. Varsayılan ilke SafeIntErrorPolicy_SafeIntException, hangi atar bir SafeIntException sınıfı bir hata ortaya çıktığında özel durum. Diğer ilke SafeIntErrorPolicy_InvalidParameter, bir hata oluştuğunda, program durur.
Hata ilkenizi özelleştirmek için iki seçenek vardır. İlk seçenek parametresini ayarlamaktır E oluşturduğunuzda bir SafeInt. Yalnızca bir ilke işleme hatası değiştirmek istediğinizde bu seçeneği kullanın SafeInt. Diğer seçeneği tanımlamaktır _SAFEINT_DEFAULT_ERROR_POLICY , içine önce özelleştirilmiş hata işleme sınıfınızın olmasını SafeInt Kitaplığı. İlke tüm örnekleri için varsayılan hata değiştirmek istediğinizde bu seçeneği kullanın SafeInt kodunuzda sınıfı.
Not
SafeInt kitaplığından hataları işleme özelleştirilmiş bir sınıf kodu hata işleyicisi adlı Denetim vermemelidir.Sonra sonucu hata işleyicisi olarak adlandırılan SafeInt işlem güvenilir olamaz.
Gereksinimler
Başlık: safeint.h
Namespace: msl::utilities