संपादित करें: यह नीचे प्रस्तुत (सरलीकृत) मामले में सर्वोत्तम अभ्यास के बारे में एक चर्चा है। जो भी उपकरण, कोडिंग शैली या कुछ और जिसे आप सुझाव देना चाहते हैं, इसे पोस्ट करें। धन्यवाद।क्या सी ++ कन्स्ट्रक्टर (और विनाशक) घोषित/परिभाषित करने का कोई विशेष तरीका है
कक्षा के नाम को डुप्लिकेट किए बिना सीटीआर/डाटर घोषित करने या परिभाषित करने के कोई विशेष तरीके क्यों नहीं हैं? यह कष्टप्रद है, खासकर जब कक्षा का नाम बदलना प्रोटोटाइप और समाप्त होता है।
क्या मेरा मतलब है इस तरह typedef के साथ कुछ है:
struct SomeClassThatDoesSomething {
typedef SomeClassThatDoesSomething ThisClass;
ThisClass() { PrepareToDie(); }
ThisClass(int a) : _a(a) { PrepareToDie(); }
ThisClass(float a, int b) : _b(a), _a(b) { PrepareToDie(); }
ThisClass(float a, char * b) : _b(a), _c(b) { PrepareToDie(); }
ThisClass(char * a, int b) : _c(a), _a(b) { PrepareToDie(); }
ThisClass(ThisClass &rhs) { }
~ThisClass() {}
void Burn() {}
void PrepareToDie() {}
int _a;
float _b;
char *_c;
};
struct SomeDerivedClassThatDoesSomething : public SomeClassThatDoesSomething {
typedef ThisClass BaseClass;
typedef SomeDerivedClassThatDoesSomething ThisClass;
ThisClass(BaseClass &is_not_amused) : BaseClass(is_not_amused) { BaseClass::_a = 1; PrepareToDie(); }
ThisClass(float a, char * b) : BaseClass(b, a) {}
~ThisClass() { BaseClass::Burn(); }
unsigned int _a; // Different semantics up the tree.
};
//EDIT: Consider this: Enforce export name decoration policy.
#define DLL_API __declspec(dllexport)
// ... or dllimport - not the point here
#define def_export_struct(name) struct C##name; typedef C##name *P##name; struct DLL_API C##name
def_export_struct(SomeOtherClassThatDoesSomething) : public SomeDerivedClassThatDoesSomething
{
//...
};
namespace mass_destruction {
def_export_struct(Int)
{
//... (The point is that search and replace gets very unreliable in big projects)
}
};
यह केवल ctors के लिए और केवल MSVC पर काम करता है; मैं इसका उपयोग कर रहा हूं और, हालांकि एक बड़ी सुविधा नहीं है, यह जीवन को आसान बनाता है। यह एक मामूली उदाहरण है, लेकिन एक काफी जटिल संरचना की कल्पना करो। (एक आसान दुष्प्रभाव यह भी है कि आपके नाम को ट्रैक किए बिना कक्षा में उपनाम है।) क्या मुझे कुछ याद आ रही है? क्या मैं वास्तव में अकेला हूं जिसकी आवश्यकता है? बिंदु यह नहीं है कि यह संकलित करता है, बिंदु यह है कि मुझे यह आंशिक रूप से मेरे लिए जगह पर काम कर रहा है और यह आश्चर्य करता है। जब तक मैं मानक हिट नहीं करता ... (यह अनुपालन चर्चा नहीं है।)
आधुनिक आईडीई में सभ्य रिफैक्टरिंग क्षमताएं होती हैं (या प्लगइन जो उन्हें प्रदान करते हैं), इसलिए कक्षा का नाम बदलना बहुत आसान हो जाता है। इसलिए, मुझे ऐसी सुविधा की आवश्यकता नहीं है। –
यह वास्तव में स्पष्ट नहीं है कि आप क्या पूछ रहे हैं। चाहे ऐसी सुविधा मौजूद है, या * क्यों * यह अस्तित्व में नहीं है, कुछ और? और कहकर आप पहले से ही इस तरह की सुविधा के बारे में जानते हैं और आप अनुपालन में रूचि नहीं रखते हैं, यह जानना मुश्किल है कि आप और क्या चाहते हैं। – jalf
@ BjörnPollex: सी ++ के लिए कैपेबिलिट्स को रीफैक्टरिंग आम तौर पर अपने जावा/सी # समकक्षों के पीछे पीछे हट रहे हैं। और उस तरफ, हर कोई आईडीई का उपयोग नहीं करता है, और शायद ही कभी भाषा सुधार करने के लिए आईडीई का उद्देश्य * अनावश्यक * – jalf