2013-04-11 15 views
9

मुझे कक्षा के उदाहरणों के पॉइंटर्स बनाने की आवश्यकता है, और प्रोग्राम संकलन समय पर नहीं जानता कि मैं कितने पॉइंटर्स बनाउंगा। हटाने के लिए, मैं एक वेक्टर में पॉइंटर्स को संग्रहीत करने पर विचार कर रहा था, और फिर उन्हें एक-एक करके हटा रहा था। स्मार्ट पॉइंटर्स का उपयोग करने के लिए एक क्लीनर तरीका होगा? और यदि कोई स्मार्ट पॉइंटर्स का उपयोग नहीं करना चाहता है, तो क्या वेक्टर का उपयोग साफ माना जाएगा?पॉइंटर्स के वेक्टर को हटाने

न्यूनतम कोड:

#include <vector> 
using namespace std; 

class Foo { 
public: 
    Foo(); 
}; 
Foo::Foo(){} 
void createFooVector(int nb, std::vector<Foo*> &v){ 
    for(int i=0;i<nb;i++){ 
     Foo* f = new Foo(); 
     v.push_back(f); 
    } 
} 
int main(int argc, char *argv[]){ 
    std::vector<Foo*> v; 
    createFooVector(5,v); 
    while (!v.empty()){ 
     Foo* f = v.back(); 
     v.pop_back(); 
     delete f; 
    } 
} 
+2

क्या आपको वाकई पॉइंटर्स के कंटेनर की आवश्यकता है? क्या आप अपनी 'Foo' ऑब्जेक्ट्स को मानों के रूप में स्टोर नहीं कर सकते ('std :: vector ')? साथ ही, क्या यह स्पष्ट नहीं होगा कि 'createFooVector' ने तर्क के रूप में दिए गए को संशोधित करने के बजाय एक नया वेक्टर लौटाया हो? –

+0

@LucTouraille मैं इस कारण से सूचक का उपयोग करता हूं: http://stackoverflow.com/questions/15471193/vector-of-virtual-class-are-pointers-the-clean-way-to-go ... यह नहीं हो सका हालांकि मैं यहां दिखाए गए कोड में देखा जा सकता है, इसे कम से कम – Vince

उत्तर

3

मेरा सुझाव है या तो एक boost::pointer_vector, एक std::vector<std::unique_ptr<Foo>>, या अपने स्वयं Foo प्रबंधक वर्ग है जो एक vector<Foo*> रखती है और निर्माता में विलोपन का ख्याल रखता है शुरू का उपयोग कर (यदि आप "विशेषज्ञ" समाधान है, और केवल प्रयास के रूप में यह देखना चाहिए अगर आप अपवाद सुरक्षा पूरी तरह से समझते हैं)। आप मैन्युअल रूप से हटाने को नहीं करना चाहते हैं, जो आसानी से त्रुटियों का कारण बन सकता है।

+0

रखने की कोशिश की, हालांकि मैं प्रबंधक समाधान की अनुशंसा नहीं करता; संभावना है कि ओपी अपवादों के संबंध में पर्याप्त सुरक्षित नहीं होगा ... –

+0

@MatthieuM। सच सच। मैंने इसके बारे में एक चेतावनी जोड़ा। – juanchopanza

1

आपका कोड ठीक है। हालांकि, स्मार्ट पॉइंटर्स का उपयोग करना पसंदीदा विकल्प होना चाहिए (लिखने के लिए कम कोड और मेमोरी बग के लिए बहुत कम अवसर)।

1

क्या स्मार्ट पॉइंटर्स का उपयोग करने के लिए एक क्लीनर तरीका होगा?

हां।

और यदि कोई स्मार्ट पॉइंटर्स का उपयोग नहीं करना चाहता है, तो क्या इसका उपयोग वेक्टर को साफ माना जाएगा?

मैं इसे इस मामले में boost::pointer_containers की तरह कुछ का उपयोग करना बेहतर कोई विचार, क्यों किसी को सी ++ में उपयोग के स्मार्ट संकेत नहीं चाहता है है, अगर यह होमवर्क ... नहीं है लेकिन मुझे लगता है,।

1

यदि आप Foo से प्राप्त कक्षाओं का उपयोग नहीं कर रहे हैं, और Foo निर्माण की प्रतिलिपि बनाने के लिए अपेक्षाकृत सस्ती है, तो बस vector<Foo> का उपयोग करें।

यदि आपका कंपाइलर चलती अर्थशास्त्र का समर्थन करता है तो कोई समस्या नहीं होनी चाहिए।

+1

चाहे मामूली चीज़ों का निर्माण करना महंगा हो, मुझे लगता है कि आप * कॉपी * के लिए महंगा होने के बारे में सोच रहे थे। हालांकि, चलने वाले अर्थशास्त्र के साथ, यह एक मुद्दा नहीं हो सकता है ... और यदि सबसे खराब स्थिति सबसे खराब होती है, तो कोई नया 'emplace_back' सदस्य का उपयोग कर सकता है। –

+0

@Matthieu हां, अर्थशास्त्र को सबकुछ बदल दें। एक वेक्टर में एक मूल्य को धक्का देने के लिए, मेरा मतलब स्पष्ट करने के लिए, आपको इसे बनाना होगा, फिर वेक्टर प्रतिलिपि एक और बनाती है। मेरा मतलब सामान्य रूप से मूल्यों के निर्माण पर विचार करने की आवश्यकता को इंगित करना था। मैं 'कॉपी निर्माण' कहने के लिए अद्यतन करूंगा। –

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