2013-05-08 32 views
10

o kadar o if() davranışını değiştirmek mümkün mü? veya ...C++ 'aşırı yükleme' eğer() ifadesi

Açık bir kullanıcı tanımlı tür dönüşümü int çalışma/uygun bir yaklaşım olur mu? veya ...

if(foo.getX()) gibi bir şey yapmak en iyisi mi?

+4

, güvende bool deyim içine bakmak isteyebilirsiniz .html – Yuushi

cevap

22

Sen operator bool() tanımlayarak bir boolean değer olarak nesneyi dönüştürebilirsiniz:

explicit operator bool() const 
{ 
    return foo.getX(); 
} 

explicit kelime Foo den bool için örtülü dönüşüm önler. Örneğin,, foo + 1 gibi bir aritmetik ifadeye yanlışlıkla koyarsanız, operator bool()explicit bildirirseniz, derleyici bu hatayı algılayabilir, aksi halde, foo, amaçlanmamış olsa bile 'a dönüştürülür. (Isteğe bağlı explicit ve const niteleyici ile birlikte) şeklinde

operator TypeName() 

genel üye fonksiyonlar

dönüşüm operatörleri. Sınıfınızı TypeName ile belirtilen herhangi bir türe dökmenizi sağlar. Diğer yönde ise, tek bağımsız değişkenle kurucular size sınıf türlü yayın yapmalarına izin vermek: Bu sınıf için örtülü dönüşüm tanımlar

class Foo { 
    Foo(int x); // convert int to Foo 
    operator bool() const; // convert Foo to bool 
    int x; 
}; 

. Derleyici, mümkünse bu dönüşümleri uygulamayı dener (yerleşik veri türleri için yaptığı gibi, örneğin 5 + 1.0). İstenmeyen örtülü dönüşümleri bastırmak için explicit olmasını bildirebilirsiniz.

+7

Bunu açık yapmak muhtemelen daha iyidir. – chris

+1

Siz ** kesinlikle ** insanların "! MyClass" gibi şeyler yapmasına izin vermek istemediğiniz sürece bu açıklığı işaretlemek istersiniz. – templatetypedef

11

Sen bool

class Foo 
{ 
    int x; 
public: 
    operator bool() const 
    { 
    return x > 0; 
    } 
}; 

nesneyi dönüştürmek için bir operatör tanımlayabilirsiniz Ama gerçekleşecek dönüşüm arzu olmadığında bu bool nedeniyle örtülü dönüşüm istenmeyen sonuçlar doğurabilir. Örneğin

int x = 42 + Foo(); 

C++ 11 sonra ancak böyle bir if ifadesi içindeki belirli bağlamlarda örtük dönüşümleri, izin verir explicit gibi dönüşüm operatörü ilan izin vererek bu sorunu çözer. http://www.artima.com/cppsource/safebool: Bir C++ 03 bağlamda bu gerekiyorsa

explicit operator bool() const // allowed in C++11 

Şimdi

int x = 42 + Foo(); // error, no implicit conversion to bool 
int x = 42 + static_cast<bool>(Foo()); // OK, explicit conversion is allowed 
İlgili konular