2009-05-25 12 views
8

Ich würde gerne sehen, wie dieses Beispiel des vorhandenen Codes in der Lage sein würde, die C++ 0x Initialisierungslistenfunktion zu nutzen.C++ 0x Initialisierungsliste Beispiel

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

es so etwas wie dies unterstützen würde:

Example1:

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

Oder muss es Literale haben wie diese ?:

Example2:

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

Wenn ja, wie würde der Unterschied zwischen AskString und Ask behandelt werden?

Antwort

9

Sie letzte Beispiele wäre nicht erlaubt, wie Sie nach Zeigern fragen, sondern versuchen, stattdessen lokale temporäre Objekte bereitzustellen.

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

Das wäre erlaubt und es gäbe keine Typenzweideutigkeit.

Das ist richtig sein würde:

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 mehr 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 auf den Typen sein.

-2

Eine C++ - Initialisierungsliste ist homogen, was bedeutet, dass es den gleichen Typ haben muss, also ist Beispiel # 2 out. Wenn Sie new in Beispiel 1 verwendet haben, würde es funktionieren.

+0

Wenn Sie std :: vector verwenden, können Sie AskString nicht hinzufügen! – mmmmmmmm

+0

Ich dachte AskString war eine Funktion, die ein Ask, dumme mich zurückgab. – rlbond

+0

Das ist sehr falsch. AskString ist ein eindeutiger Typ, der Ask als seine Basisklasse verwendet. Was Sie eine Funktion nennen, ist ein Konstruktor. Sie sind sehr unterschiedliche Dinge. – jmucchiello