2010-03-01 7 views

risposta

14

Si chiama "costruttore delegare". Non è ancora disponibile nella lingua. Ma c'è una proposta formale, la troverai nell'Allegato F.3.1 dello language specification. Data la posizione di Microsoft nei confronti di C++/CLI, è improbabile che veda presto la luce del giorno.


UPDATE: delegare costruttori avuto una vita al di là della proposta in tale allegato, sono stati aggiunti per le specifiche del linguaggio C++ 11 standard. Microsoft ha lavorato per ottenere implementazioni di C++ 11 implementate. I costruttori delegati alla fine ce l'hanno fatta per VS2013. E funzionano anche in C++/CLI in quella edizione.

1

È possibile farlo seguendo

ref class A 
{ 
public: 
    A(int p) : p(p) { this->A::A(); } 
    A() : p(1) {} 

    int p; 
}; 

Non è codice valido C++, ma VC compila bene :)

-5

Quando hai detto "So che non esiste un modo per fare questo in pure C++ " eri in errore. È possibile farlo in C++ nativo. È possibile utilizzare il nuovo operatore di posizionamento per farlo.

class A 
{ 

public: 

    A(int p) : p(p) 
    { new(this)A(); } 

    A() : p(1) {}  

    int p; 
}; 
+1

Sbagliato. http://www.parashift.com/c++-faq-lite/init-methods.html – user634175

+0

Questo è così sbagliato. – Puppy

0

Appena inciampato, per la stessa domanda. Nel mio caso sto usando VS2010.

È chiaro che VS2010 non verrà mai aggiornato per implementare completamente C++ 11, utilizzare VS2015 se è necessario un migliore rispetto dello standard (cosa che faccio quando posso). Ma per alcuni progetti (legacy) devo ancora usare VS2010.

Un approccio che funziona in molti casi (per me) è l'uso di una funzione privata con tutti i codici di inizializzazione condivisi in esso. Esempio:

class A 
{ 
private: 
    void Inidialise() { /* common initialisation here */ } 

public: 
    A()  { Initialise(); /* specific initialisation for A() here */ } 
    A(bool a) { Initialise(); /* specific initialisation for A(bool) here */ } 
    A(int b) { Initialise(); /* specific initialisation for A(int) here */ } 

    /* etcetera */ 

} 

Essa non risolve tutti i problemi '' e non impedisce tutti i casi di codice duplicato, ma va un lungo cammino.