2010-02-07 13 views
7

Per due classi non correlate "classe A" e "classe B" e una funzioneC++ conversioni auto

B convert(const A&); 

C'è un modo per dire C++ per automaticamente, per qualunque funzione che prende di "classe B", come argomento, per convertire automaticamente una "classe A".

Grazie!

+2

Se non è possibile modificare le definizioni di classe per la classe A o la classe B, non esiste un modo valido per farlo. – Omnifarious

risposta

10

quello che normalmente fare in questo caso è dare B un costruttore che prende un A:

class B 
{ 
public: 
    B(const A&); 
}; 

e fare la conversione di lì. Il compilatore dirà "Come posso fare A a B? Oh, vedo che lo B può essere costruito da un A".

Un altro metodo è quello di utilizzare un operatore di conversione:

class A 
{ 
public: 
    operator B(void) const; 
} 

e il compilatore dirà "Come posso fare A un B Oh, capisco A possono essere convertiti in B?".

Tenere presente che questi sono molto facili da abusare. Assicurati che abbia davvero senso che questi due tipi si convertano implicitamente l'uno nell'altro.

+3

In secondo luogo, l'avvertenza relativa agli operatori di conversione implicita. Durante gli ultimi dieci anni, ogni volta che ero tentato di introdurre una cosa del genere (con l'eccezione di una classe di archi che scrivevo una volta), prima o poi si è scoperto a calci quando nessuno se lo aspettava ed è stato quindi rimosso dal codice - spesso a un bel costo. Inoltre, tieni presente che il compilatore invoca sempre sempre solo una conversione definita dall'utente. Quindi se c'è anche una conversione definita dall'utente da 'B' a' C', non puoi chiamare 'void f (C)' con un 'A', perché questo richiederebbe due conversioni. – sbi

1

È possibile fornire un operatore di trasmissione o un costruttore a un parametro.