एक सामान्य नियम के रूप में, मैं सी ++ में पॉइंटर अर्थशास्त्र के बजाय मूल्य का उपयोग करना पसंद करता हूं (यानी का उपयोग vector<Class*>
के बजाय)। आमतौर पर प्रदर्शन में मामूली हानि गतिशील रूप से आवंटित वस्तुओं को हटाने के लिए याद रखने के लिए बनाई गई है।क्या मेरे पास सी ++ में मूल्य semantics के साथ polymorphic कंटेनर हो सकता है?
दुर्भाग्य से, जब आप एक सामान्य आधार से प्राप्त विभिन्न प्रकार के ऑब्जेक्ट प्रकारों को स्टोर करना चाहते हैं तो मूल्य संग्रह काम नहीं करते हैं। नीचे उदाहरण देखें।
#include <iostream>
using namespace std;
class Parent
{
public:
Parent() : parent_mem(1) {}
virtual void write() { cout << "Parent: " << parent_mem << endl; }
int parent_mem;
};
class Child : public Parent
{
public:
Child() : child_mem(2) { parent_mem = 2; }
void write() { cout << "Child: " << parent_mem << ", " << child_mem << endl; }
int child_mem;
};
int main(int, char**)
{
// I can have a polymorphic container with pointer semantics
vector<Parent*> pointerVec;
pointerVec.push_back(new Parent());
pointerVec.push_back(new Child());
pointerVec[0]->write();
pointerVec[1]->write();
// Output:
//
// Parent: 1
// Child: 2, 2
// But I can't do it with value semantics
vector<Parent> valueVec;
valueVec.push_back(Parent());
valueVec.push_back(Child()); // gets turned into a Parent object :(
valueVec[0].write();
valueVec[1].write();
// Output:
//
// Parent: 1
// Parent: 2
}
मेरा प्रश्न
है: मैं अपने केक (मूल्य अर्थ विज्ञान) है और यह भी खाना (बहुरूपी कंटेनर) कर सकते हैं? या मुझे पॉइंटर्स का उपयोग करना है?
'boost :: ptr_vector' अक्सर' std :: vector> ' –
ben
के लिए एक सस्ता और सरल विकल्प होता है यह उत्तर मूल्य अर्थशास्त्र को संबोधित नहीं करता है। share_ptr टी से व्युत्पन्न कक्षाओं पर संदर्भ अर्थशास्त्र प्रदान करता है, इंस्टेस के लिए, shared_ptr ए, बी; बी .reset (नया व्युत्पन्न 1); ए = बी; Derived1 ऑब्जेक्ट की एक प्रति नहीं बनाता है। –
Aaron
मैंने कभी नहीं कहा कि मेरा समाधान मूल्य semantics संबोधित किया। मैंने कहा कि यह "एक उचित समाधान" था। यदि आप पॉलिमॉर्फिक वैल्यू सेमेन्टिक्स रखने के तरीके के बारे में जानते हैं तो सही कदम उठाएं और अपने नोबेल पुरस्कार को इकट्ठा करें। –