2009-05-25 17 views
8

मैं देखना चाहता हूं कि मौजूदा कोड का यह उदाहरण सी ++ 0x प्रारंभकर्ता सूची सुविधा का लाभ कैसे ले सकता है।सी ++ 0x प्रारंभकर्ता सूची उदाहरण

Example0:

example1:

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

यह कुछ इस तरह का समर्थन करेंगे

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

या इस ?:

Example2 है जैसे कि यह शाब्दिक होना चाहिए:

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

यदि ऐसा है तो AskString और Ask के बीच का अंतर कैसे संभाला जाएगा?

उत्तर

9

आप अंतिम उदाहरणों की अनुमति नहीं दी जाएगी क्योंकि आप पॉइंटर्स के लिए पूछते हैं लेकिन स्थानीय अस्थायी वस्तुओं को इसके बजाय प्रदान करने का प्रयास करते हैं।

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

इसकी अनुमति होगी और कोई प्रकार की अस्पष्टता नहीं होगी।

यह सही भी होगा:

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

और अपने उदाहरण और अधिक की तरह है:

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

और फिर वहाँ प्रकार पर कोई अस्पष्टता नहीं होगा।

-2

एक सी ++ प्रारंभकर्ता सूची homogenous है, जिसका अर्थ है कि इसमें एक ही प्रकार होना चाहिए, इसलिए उदाहरण # 2 बाहर है। उदाहरण के लिए यदि आपने new का उपयोग किया है, तो यह काम करेगा।

+0

यदि आप std :: vector का उपयोग करते हैं तो आप AskString नहीं जोड़ सकते! – mmmmmmmm

+0

मैंने सोचा कि AskString एक ऐसा फ़ंक्शन था जो एक पूछता है, मूर्ख मुझे। – rlbond

+0

यह बहुत गलत है। AskString एक विशिष्ट प्रकार है जो इसकी बेस क्लास के रूप में पूछता है। आप जो फ़ंक्शन कहते हैं वह एक कन्स्ट्रक्टर है। वे बहुत अलग चीजें हैं। – jmucchiello

संबंधित मुद्दे