2012-04-04 14 views
9

में पैरामीटर की मेक_श्रेयर संख्या विजुअल स्टूडियो 2010/2011 में वैरिएडिक टेम्पलेट्स (अभी भी!) की अनुपस्थिति में, एक कन्स्ट्रक्टर जो बहुत से पैरामीटर लेता है समस्याग्रस्त हो सकता है। उदाहरण के लिए निम्नलिखित संकलन नहीं:std :: कन्स्ट्रक्टर

MyMaterials.push_back(std::make_shared<Material>(MyFacade, 
                name, 
                ambient, 
                diffuse, 
                specular, 
                emissive, 
                opacity, 
                shininess, 
                shininessStrength, 
                reflectivity, 
                bumpScaling, 
                maps, 
                mapFlags)); 

है, क्योंकि यह 13 मापदंडों है और मैं make_shared arg9 को arg0 से सीमित है लगता है। स्पष्ट कार्य-आसपास दो भाग निर्माण है, लेकिन मैं इससे बचने की उम्मीद कर रहा था। क्या मेक_श्रेड के बजाय नया के उपयोग के अलावा, यहां कोई अन्य संभावना है?

धन्यवाद।

उत्तर

20

आप एक वर्ग का निर्माण कर सकते हैं जिसे तब ढेर आवंटित मूल्य में स्थानांतरित किया जाएगा।

MyMaterials.push_back(std::make_shared<Material>(
    Material(MyFacade, name, ambient, diffuse, specular, 
      emissive, opacity, shininess, shininessStrength, 
      reflectivity, bumpScaling, maps, mapFlags))); 
+0

आह। बेशक। यह सही समझ में आता है। – Robinson

+0

अच्छी बात यह है कि make_shared share_plr –

+0

बनाते समय अनुकूलित एक-आवंटन दिनचर्या का भी उपयोग करेगा क्षमा करें - मुझे नहीं लगता कि यह कैसे स्थानीय ढेर (जहां सामग्री() का निर्माण किया जा रहा है) से चिपकने से बचाता है (जहां वास्तव में make_shared होगा इसे लगादो)। इस मामले में, प्रतिलिपि को संभवतः कैसे बचाया जा सकता है? – Mordachai

1

आप सभी प्रासंगिक सदस्यों के साथ "इनपुट स्ट्रक्चर" बना सकते हैं।
इसे सही मानों से भरें और इसके साथ ही कन्स्ट्रक्टर को अपने एकमात्र परम के रूप में कॉल करें।

+0

यह भी एक अच्छा विचार है, लेकिन मैं इस तरह की चीजों के लिए अपर्याप्त "यादृच्छिक" structs से बचना चाहता हूं :-)। – Robinson

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