shared_ptr
जैसी कक्षाओं को उनके रचनाकारों में एक और टेम्पलेट क्यों है?सामान्यीकृत प्रतिलिपि बनाने वाले
उदाहरण के लिए:
template<class T> class shared_ptr {
public:
template<class Y>
explicit shared_ptr(Y * p);
मैं स्कॉट Meyers के प्रभावी सी ++, मद 45 है, जो कहते हैं कि यह पीछे विचार यह उन के माध्यम से बहुरूपता संभव बनाने के लिए है पढ़ने किया गया है; जो है, shared_ptr<B>
से shared_ptr<A>
निर्माण बी ए
से ली गई है लेकिन
explicit shared_ptr(T * p);
काफी की तरह एक निर्माता को परिभाषित नहीं कर रहा है तो क्या होगा? मेरा मतलब है, इस कोड को बस ठीक काम करता है:
class C1 {
};
class C2 : public C1 {
};
template<typename T>
class A
{
public:
A(T &a)
{
var1 = a;
}
T var1;
};
int main(int argc, char *argv[])
{
C2 c2;
A<C1> inst1(c2);
}
तो क्यों न हम वहाँ निर्माता के लिए एक और टेम्पलेट की जरूरत है? केवल एक Base*
लेता
#include <memory>
class Base {};
class Derived : public Base {};
int main() {
std::shared_ptr<Base> ptr(new Derived);
}
तो shared_ptr
, यह अंततः कि Base*
सूचक पर delete
कॉल करने के लिए मजबूर किया जाता है:
क्या होगा यदि दो प्रकार विरासत का उपयोग करके एक-दूसरे से प्राप्त नहीं होते हैं, लेकिन वे एक दूसरे के बीच * परिवर्तनीय * हैं? –
@ सोप्रप्रोग्रामड्यूड अगर वे एक दूसरे के लिए परिवर्तनीय हैं, तो मेरा समाधान नहीं होगा 'वैसे भी काम करते हैं?चूंकि कक्षा को किसी प्रकार के लिए तत्काल किया जाएगा और नियमित रूपांतरण होगा, क्योंकि यह कुछ टी का एक ठोस वर्ग था? –
भले ही विभिन्न प्रकार की दो वस्तुओं को एक-दूसरे के बीच परिवर्तित किया जा सके, फिर भी प्रकार अलग-अलग हैं। इसका मतलब यह होगा कि टेम्पलेट पैरामीटर 'टी' को दो अलग-अलग प्रकारों का प्रतिनिधित्व करना होगा, जो संभव नहीं है। –