2011-01-12 19 views
8

İki int argümanıyla çeşitli işlevlerim var (hem işlevleri hem de çağrı kodunu kendim yazarım). Bazı çağrılarda argüman sırasını karıştırmaktan korkuyorum.C++: tür int türündeki değişkenleri ayırt etmek için güvenlik tipi kullanma

Derleyicinin beni uyarması veya yanlış argüman dizisi olan bir işlevi çağırırsam hata yapması için tür güvenliğinden nasıl yararlanabilirim (tüm argümanlar int'dir)?

Ben typedefs çalıştı: TypeDef herhangi derleyici uyarı ve hataları tetiklemez:

typedef int X; typedef int Y; 

void foo(X,Y); 

X x; Y y; 

foo(y,x); // compiled without warning) 
+1

Bunun gibi yararlı bir şey bulabilirsiniz: http://calumgrant.net/units/units.html –

cevap

12

Sarıcı sınıfları oluşturmanız gerekir. Her ikisi de ints olarak gösterilen iki farklı birime sahip olduğunuzu söyleyelim (saniyeler, dakikalar). Tamamen türgüvenli olmaya aşağıdaki gibi bir şey gerekir:

class Minute 
{ 
public: 
    explicit Minute(int m) : myMinute(m) {} 
    operator int() const { return myMinute; } 

private: 
    int myMinute; 
}; 

ve saniyeler için de benzer bir sınıf. Açık yapıcı, Minute olarak bir int kullanarak yanlışlıkla engeller, ancak dönüşüm operatörü bir Minute bir int ihtiyacınız olan her yerde kullanmanıza izin verir.

+5

Daha eksiksiz ve genel bir uygulama için http://www.boost.org/doc/libs adresini de inceleyebilirsiniz. /1_42_0/boost/strong_typedef.hpp – UncleBens

4

typedef adlar yazın oluşturur. Bulduğun gibi, orada güvenlik yok.

Bir olasılık, elde etmeye çalıştığınız şeye bağlı olarak enum kullanmaktır. Bu tam olarak tehlikeli değil, ama daha yakın. Örneğin, bir enum parametresini döküm yapmadan geçiremezsiniz.

-5

Bir not alın. Üzerine yaz, büyük harflerle, "X İLK! SONRA Y!" Bilgisayarınızın ekranına yapıştırın. Dürüst olmak gerekirse başka ne tavsiye edeceğimi bilmiyorum. Sorunun bir post-it ve sihirli bir işaretleyici ile çözülebildiği durumlarda, sarıcı sınıflarını kullanmak kesinlikle fazladır.

+5

Coğrafi yazılım geliştiricileri sorun. Lat/uzun veya uzun/lat mi? Sarmalayıcı sınıflarının çalıştığı klasik bir durum ve bunu yapmadı. – MSalters

İlgili konular