Domanda

Ho una classe che ha definito un operatore di definito dall'utente per un TCHAR *, in questo modo

CMyClass::operator const TCHAR*() const
{
    // returns text as const TCHAR*
}

Voglio essere in grado di fare qualcosa di simile

CMyClass myClass;
_tprintf(_T("%s"), myClass);

o anche

_tprintf(_T("%s"), CMyClass(value));

Ma quando si cerca, printf sempre stampe (null) invece del valore. Ho anche provato un normale operatore char *, nonché variazioni con ecc const Funziona correttamente solo se chiamo esplicitamente l'operatore o fare un cast, come

_tprintf(_T("%s\n"), (const TCHAR*)myClass);
_tprintf(_T("%s\n"), myClass.operator const TCHAR *());

Tuttavia, non voglio lanciare. Come può essere raggiunto?

Si noti che una possibilità è quella di creare una funzione che ha un parametro di const TCHAR *, in modo che le chiamate forzate l'operatore TCHAR *, ma questo anche io non voglio realizzare.

È stato utile?

Soluzione

operatori di conversione evitare. Raramente fanno ciò che si vuole, e chiede quindi espliciti sono dolorose. Rinominare operator const TCHAR*() const a TCHAR *str() const.

Altri suggerimenti

dice standard c ++ che le conversioni implicite come questo non sono applicati ai parametri di puntini di sospensione - come sarebbe il compilatore sapere cosa conversione da applicare? Si dovrà eseguire la conversione in modo esplicito da soli, o meglio ancora smettere di usare printf.

operatori di conversione vengono chiamati quando il compilatore vuole convertire un valore ad un altro tipo. Questo funziona per le funzioni che accettano i parametri definiti di tipi specifici. Non funziona per le funzioni variadic come printf() con ... nella dichiarazione di funzione. Queste funzioni prendono gli argomenti e poi lavorare con loro, così l'operatore di conversione non viene mai chiamato.

Per essere precisi, quando il compilatore vede printf("%s", foo), passa foo, qualunque essa sia, a printf(), che dovrà assumere è adatto per un formato %s così com'è. Nessun operatore di conversione sarà chiamato (anche se alcune promozioni aritmetici avranno luogo).

operatori di conversione in problemi generali di causa. Avendo tale operatore in quella classe, hai complicato risoluzione funzione di sovraccarico, dal momento che il compilatore può interpretare un CMyClass come se si trattasse di un TCHAR *. Ciò può causare risultati inaspettati, sia causando il codice per compilare quando davvero non voleva che, o selezionando la funzione di sovraccarico sbagliata. (Ad esempio, dato CMyClass cmc;, il cmc + 10 espressione è improvvisamente legale, poiché TCHAR * + int è perfettamente legittimo puntatori.) È pratica corrente per etichettare tale conversioni explicit.

Casting è la cosa giusta da fare se si desidera utilizzare le API di stile printf e contare su un operatore di conversione (e io non ho intenzione di discutere qui se o non si dovrebbe usare queste funzioni). Tuttavia, vorrei usare getto statico, per esempio _tprintf(_T("%s\n"), static_cast<const TCHAR*>(myClass));

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top