C ++ 0x inicializador exemplo lista
-
05-09-2019 - |
Pergunta
Eu gostaria de ver como este exemplo de código existente seria capaz de aproveitar a ++ 0x C initializer recurso de lista.
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: "));
}
Será que apoiar algo como isto:
Exemplo 1:
std::vector<Ask*> ui ={
AskString("Enter your name: ", 3, 25),
AskString("Enter your city: ", 2, 25),
Ask("Enter your age: ")
};
ou deve ter literais como este:?
Exemplo 2:
std::vector<Ask*> ui ={
{"Enter your name: ", 3, 25},
{"Enter your city: ", 2, 25},
{"Enter your age: "}
};
Se sim, como seria a diferença entre AskString e Ask ser tratado?
Solução
Você últimos exemplos não seria permitido, como você perguntar para os ponteiros, mas tentar fornecer objetos temporários locais em vez.
std::vector<Ask*> ui ={
new AskString{"Enter your name: ", 3, 25},
new AskString{"Enter your city: ", 2, 25},
new Ask{"Enter your age: "}
};
Isso seria permitido e não haveria nenhum tipo de ambigüidade.
Isso seria certo também:
std::vector<Ask*> ui ={
new AskString("Enter your name: ", 3, 25),
new AskString("Enter your city: ", 2, 25),
new Ask("Enter your age: ")
};
E o seu exemplo é mais parecido com:
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 novamente não haveria nenhuma ambiguidade sobre os tipos.
Outras dicas
A c ++ initializer lista é homogênea , o que significa que deve ter todos do mesmo tipo, de modo exemplo # 2 está fora. Se você usou new
no exemplo 1, ele iria trabalhar.