नीचे कोड के दो टुकड़े (संकलित करने के लिए तैयार) हैं। पहले खंड में जिसमें मैं एक संरचना के लिए केवल आगे की घोषणा का उपयोग कर रहा हूं, जबकि अतिथि वर्ग के लिए बेस क्लास डीटीआर से इस संरचना में पॉइंटर को हटाया जाता है।
दूसरे खंड में जब आगे की घोषणा की बजाय मैं इस अतिथि वर्ग की पूर्ण परिभाषा का उपयोग आधार कार्यों में हटाकर उपयोग करके कर रहा हूं।
क्यों? यह एक फर्क क्यों पड़ता है? आगे की घोषणा एक संकलक के लिए सिर्फ एक नोट होने का अनुमान नहीं है कि इस वर्ग/संरचना की परिभाषा कहीं और है?
मुझे आश्चर्य है कि यह सहजता से काम नहीं करता है।आगे की घोषणा नहीं होगी
//First just forward dclr
#include "stdafx.h"
#include <iostream>
using std::cout;
struct Guest;
struct Base
{
Guest* ptr_;
Base(Guest* ptr):ptr_(ptr)
{
cout << "Base\n";
}
~Base()
{
cout << "~Base\n";
delete ptr_;
}
};
struct Guest
{
Guest()
{
cout << "Guest\n";
throw std::exception();
}
Guest(int)
{
cout << "Guest(int)\n";
}
~Guest()
{
cout << "~Guest\n";
}
};
struct MyClass : Base
{
Guest g;
MyClass(Guest* g):Base(g)
{
cout << "MyClass\n";
}
~MyClass()
{
cout << "~MyClass\n";
}
};
int _tmain(int argc, _TCHAR* argv[])
{
try
{
Guest* g = new Guest(1);
MyClass mc(g);
}
catch(const std::exception& e)
{
std::cerr << e.what();
}
return 0;
}
// दूसरा - पूर्ण डीईएफ़
#include "stdafx.h"
#include <iostream>
using std::cout;
struct Guest
{
Guest()
{
cout << "Guest\n";
throw std::exception();
}
Guest(int)
{
cout << "Guest(int)\n";
}
~Guest()
{
cout << "~Guest\n";
}
};
struct Base
{
Guest* ptr_;
Base(Guest* ptr):ptr_(ptr)
{
cout << "Base\n";
}
~Base()
{
cout << "~Base\n";
delete ptr_;
}
};
struct MyClass : Base
{
Guest g;
MyClass(Guest* g):Base(g)
{
cout << "MyClass\n";
}
~MyClass()
{
cout << "~MyClass\n";
}
};
int _tmain(int argc, _TCHAR* argv[])
{
try
{
Guest* g = new Guest(1);
MyClass mc(g);
}
catch(const std::exception& e)
{
std::cerr << e.what();
}
return 0;
}
आपको दोनों मामलों में अपने बेस क्लास कन्स्ट्रक्टर वर्चुअल बनाना चाहिए। –
@ Space_C0wb0y: प्रिय, आप सी ++ में कन्स्ट्रक्टर वर्चुअल नहीं बना सकते हैं :) –
@ आर्मेन: शब्द ... धूम्रपान और दर्पण। यह मेरे दिमाग में इतना स्पष्ट था। (उन लोगों के लिए जो आश्चर्य करते हैं, यह * विनाशक * होना चाहिए) –