C ++ 0x initializer lista esempio
-
05-09-2019 - |
Domanda
Mi piacerebbe vedere come questo esempio di codice esistente sarebbe in grado di sfruttare la funzione di lista di inizializzazione 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 sarebbe la differenza tra AskString e Ask essere gestita?
Soluzione
È ultimi esempi non sarebbe stato consentito come si chiede per i puntatori, ma tenta di fornire oggetti temporanei locali invece.
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 essere consentito e non ci sarebbe nessun tipo di ambiguità.
Questo 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.
Altri suggerimenti
A c ++ lista di inizializzazione è omogenea , il che significa che devono avere tutti lo stesso tipo, in modo ad esempio # 2 è fuori. Se è stato utilizzato new
nell'esempio 1, che avrebbe funzionato.