Frage

Ich möchte sehen, wie das Beispiel der bestehenden Code der Lage wäre, die Vorteile der C ++ 0x Initialisiererliste Funktion zu übernehmen.

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

Wäre es so etwas wie dies unterstützt:

Beispiel 1:

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

Oder muss es Literale wie folgt aus:?

Beispiel 2:

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

Wenn ja, wie wäre der Unterschied zwischen AskString und Fragen behandelt werden?

War es hilfreich?

Lösung

Sie letzte Beispiele würden nicht erlaubt werden, wie Sie für Zeiger fragen, sondern versuchen stattdessen lokale temporäre Objekte zu liefern.

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

Das erlaubt sein würde und es gäbe keine Ambiguität sein.

Das wäre auch richtig:

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

Und Ihr Beispiel ist eher wie:

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

und wieder gäbe es keine Zweideutigkeit über die Art.

Andere Tipps

A c ++ Initialisiererliste ist homogen , dh es müssen alle vom gleichen Typ sein, so 2 Beispiel # out ist. Wenn Sie new in Beispiel 1 verwendet wird, würde es funktionieren.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top