2009-05-25 13 views
8

Vorrei vedere come questo esempio di codice esistente sarebbe in grado di sfruttare la funzionalità dell'elenco di inizializzazione C++ 0x.Esempio elenco inizializzatore C++ 0x

Example0:

#include <vector> 
#include <string> 
struct Ask { 
    std::string prompt; 
    Ask(std::string a_prompt):prompt(a_prompt){} 
}; 
struct AskString : public Ask{ 
    int min; 
    int max; 
    AskString(std::string a_prompt, int a_min, int a_max): 
     Ask(a_prompt), min(a_min), max(a_max){} 
}; 
int main() 
{ 
    std::vector<Ask*> ui; 
    ui.push_back(new AskString("Enter your name: ", 3, 25)); 
    ui.push_back(new AskString("Enter your city: ", 2, 25)); 
    ui.push_back(new Ask("Enter your age: ")); 
} 

sarebbe sostenere qualcosa di simile:

Esempio 1:

std::vector<Ask*> ui ={ 
    AskString("Enter your name: ", 3, 25), 
    AskString("Enter your city: ", 2, 25), 
    Ask("Enter your age: ") 
    }; 

o deve avere letterali come questo ?:

Esempio 2:

std::vector<Ask*> ui ={ 
    {"Enter your name: ", 3, 25}, 
    {"Enter your city: ", 2, 25}, 
    {"Enter your age: "} 
    }; 

Se sì, come si maneggia la differenza tra AskString e Ask?

risposta

9

Gli ultimi esempi non sono consentiti quando si richiedono i puntatori ma si tenta di fornire invece oggetti temporanei locali.

std::vector<Ask*> ui ={ 
    new AskString{"Enter your name: ", 3, 25}, 
    new AskString{"Enter your city: ", 2, 25}, 
    new Ask{"Enter your age: "} 
    }; 

Questo sarebbe consentito e non ci sarebbe alcun tipo di ambiguità.

Quello sarebbe troppo a destra:

std::vector<Ask*> ui ={ 
     new AskString("Enter your name: ", 3, 25), 
     new AskString("Enter your city: ", 2, 25), 
     new Ask("Enter your age: ") 
     }; 

E il vostro esempio è più simile a:

std::vector<Ask> ui ={ // not pointers 
    {"Enter your name: "}, 
    {"Enter your city: "}, 
    {"Enter your age: "} 
    }; 

std::vector<AskString> uiString ={ // not pointers 
    {"Enter your name: ", 3, 25}, 
    {"Enter your city: ", 2, 25}, 
    {"Enter your age: ", 7, 42} 
    }; 

e ancora una volta non ci sarebbe alcuna ambiguità sui tipi.

-2

Un elenco di inizializzazione C++ è omogeneo, il che significa che deve avere lo stesso tipo, quindi l'esempio # 2 è fuori. Se hai usato new nell'esempio 1, funzionerebbe.

+0

Se si utilizza std :: vector non è possibile aggiungere AskString! – mmmmmmmm

+0

Pensavo che AskString fosse una funzione che restituiva un Ask, sciocco me. – rlbond

+0

Questo è molto sbagliato. AskString è un tipo distinto che usa Ask come sua classe base. Ciò che chiami una funzione è un costruttore. Sono cose molto diverse. – jmucchiello

Problemi correlati