2009-05-25 10 views
8

Je voudrais voir comment cet exemple de code existant pourrait tirer parti de la fonction de liste d'initialisation C++ 0x.Exemple de liste d'initialisation C++ 0x

Exemple0:

#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: ")); 
} 

Ne serait-il soutenir quelque chose comme ceci:

Example1:

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

Ou faut-il avoir littéraux comme ça ?:

Example2:

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

Si oui, comment la différence entre AskString et Ask serait-elle traitée?

Répondre

9

Vous ne pouvez pas autoriser les derniers exemples lorsque vous demandez des pointeurs, mais essayez plutôt de fournir des objets temporaires locaux.

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

Cela serait autorisé et il n'y aurait pas d'ambiguïté de type.

Ce serait bien aussi:

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

Et votre exemple est plus comme:

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} 
    }; 

et encore il n'y aurait pas d'ambiguïté sur les types.

-2

Une liste d'initialisation C++ est homogène, ce qui signifie qu'elle doit avoir tous le même type, donc l'exemple # 2 est sorti. Si vous avez utilisé new dans l'exemple 1, cela fonctionnerait.

+0

Si vous utilisez std :: vector vous ne pourriez pas ajouter AskString! – mmmmmmmm

+0

Je pensais que AskString était une fonction qui renvoyait un Ask, idiot moi. – rlbond

+0

C'est très faux. AskString est un type distinct qui utilise Ask comme classe de base. Ce que vous appelez une fonction est un constructeur. Ce sont des choses très différentes. – jmucchiello