2013-01-06 13 views
5

Ho questa classeC++ chiamata al costruttore un altro costruttore in base a parametri di tipo

class XXX { 
    public: 
     XXX(struct yyy); 
     XXX(std::string); 
    private: 
     struct xxx data; 
}; 

Il primo costruttore (che lavora con una struttura) è facile da implementare. Il secondo posso parte una stringa in un formato specifico, analizzare e posso estrarre la stessa struttura.

La mia domanda è, in java che posso fare qualcosa di simile:

XXX::XXX(std::string str) { 

    struct yyy data; 
    // do stuff with string and extract data 
    this(data); 
} 

Utilizzando this(params) a chiamare un altro costruttore. In questo caso posso qualcosa di simile?

Grazie

risposta

2

Sì. In C++ 11, puoi farlo. Si chiama constructor delegation.

struct A 
{ 
    A(int a) { /* code */ } 

    A() : A(100) //delegate to the other constructor 
    { 
    } 
}; 
+0

Sapete quali compilatori implementano attualmente questo cambiamento, mi sembra di ricordare che Clang non (ancora) per esempio. –

+0

@MatthieuM .: Non ne ho idea. Non l'ho testato con nessun compilatore. :-) – Nawaz

+0

:) Temo che questo non sia stato considerato importante in pratica perché la delega a un metodo privato funziona già molto bene (purché tutti gli attributi supportino l'assegnazione), e quindi è a bassa priorità per tutti. –

8

Il termine che stai cercando è "constructor delegation" (o, più in generale, "costruttori incatenati"). Prima di C++ 11, questi non esistevano in C++. Ma la sintassi è come invocare una classe base costruttore:

class Foo { 
public: 
    Foo(int x) : Foo() { 
     /* Specific construction goes here */ 
    } 
    Foo(string x) : Foo() { 
     /* Specific construction goes here */ 
    } 
private: 
    Foo() { /* Common construction goes here */ } 
}; 

Se non si utilizza C++ 11, il meglio che puoi fare è definire una funzione di supporto privato a che fare con la roba comune a tutti costruttori (anche se questo è fastidioso per cose che ti piacerebbe inserire nella lista di inizializzazione). Ad esempio:

class Foo { 
public: 
    Foo(int x) { 
     /* Specific construction goes here */ 
     ctor_helper(); 
    } 
    Foo(string x) { 
     /* Specific construction goes here */ 
     ctor_helper(); 
    } 
private: 
    void ctor_helper() { /* Common "construction" goes here */ } 
}; 
+0

Sto inviando la tua risposta, perché è più completa. Ma gli esempi sarebbero molto carini. :-) – Omnifarious

+2

@Omnifarious: gli esempi ora esistono! –

Problemi correlati