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?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top