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?
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?
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.
Bunu açık yapmak muhtemelen daha iyidir. – chris
Siz ** kesinlikle ** insanların "! MyClass" gibi şeyler yapmasına izin vermek istemediğiniz sürece bu açıklığı işaretlemek istersiniz. – templatetypedef
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
, güvende bool deyim içine bakmak isteyebilirsiniz .html – Yuushi