2010-02-19 12 views
8

ho un costruttore del modulo:Prevenire cast implicito dei tipi numerici nel costruttore in C++

MyClass (int a, int b, int c);

e viene chiamato con il codice come questo:

MyClass my_object (4.0, 3.14, 0.002);

Vorrei impedire questa conversione automatica da double a int, o almeno ricevere avvisi in fase di compilazione.

Sembra che la parola chiave "esplicita" non funzioni in questi casi, giusto?

+2

Un cast è esplicito per definizione. Intendi "conversione implicita" nel titolo. –

risposta

9

Qual è il tuo compilatore? Sotto gcc, puoi utilizzare -Wconversion per avvisarti di questi tipi di conversioni.

+0

Io uso gcc, e il -Wconversion ha funzionato! Ho pensato che il -Wall includerebbe questo, ma apparentemente no! Grazie mille! – Hugo

+2

-Per mancare un sacco di cose e nemmeno -Wall -Wextra include tutto. Preferirei avere un interruttore per abilitare realmente tutti gli avvisi e quindi disabilitare quelli che causano problemi uno per uno. – Tronic

+1

Personalmente, compilo con "-Wall -Wextra -pedantic -Wformat = 2 -Wintict-overflow = 3 -Werror". Aggiungo '-Wno-unused' durante lo sviluppo perché spesso ho cose che non sono ancora pronto per usare, ma li voglio lì perché so che ne avrò bisogno. –

2

Dichiarare un costruttore privato MyClass(double a, double b, double c).

5

dichiarare un costruttore privato come questo:

private: 
template <class P1, class P2, class P3> 
MyClass(P1,P2,P3); 

che causerà un errore di compilazione per qualsiasi costruzione con 3 parametri che non sono tutti int, ed è portatile.

+0

È intelligente. :-) La soluzione di avviso è un po 'più pulita, ma la tua soluzione funziona su qualsiasi compilatore conforme. :-) Sfortunatamente non protegge contro la classe costruendo direttamente le istanze di se stesso. Devi aspettare fino al momento del collegamento per catturare quelli. – Omnifarious

+0

@Omnifarious: Con C++ 0x si contrassegna semplicemente questo overload con '= delete;' Altrimenti, se si fosse preoccupati di un uso interno scorretto, si potrebbe fornire un'implementazione che non riesce a compilare (ad esempio a causa di un'asserzione statica). – visitor

+0

Cleverer: aggiungi un secondo template di overload MyClass (P1, P2, P3, P3 * dummy = 0); '. La risoluzione del sovraccarico tra i due template sarà ambigua, ma ciò è irrilevante se entrambi sono peggiori di 'MyClass (int, int, int)' – MSalters

Problemi correlati