मुझे कुछ विरासत कोड मिला है, वर्चुअल फ़ंक्शंस के बजाय, गतिशील प्रेषण करने के लिए kind
फ़ील्ड का उपयोग करता है।सी ++ वर्चुअल फ़ंक्शंस के बिना डायनामिक डिस्पैच
// Base struct shared by all subtypes
// Plain-old data; can't use virtual functions
struct POD
{
int kind;
int GetFoo();
int GetBar();
int GetBaz();
int GetXyzzy();
};
enum Kind { Kind_Derived1, Kind_Derived2, Kind_Derived3 /* , ... */ };
struct Derived1: POD
{
Derived1(): kind(Kind_Derived1) {}
int GetFoo();
int GetBar();
int GetBaz();
int GetXyzzy();
// ... plus other type-specific data and function members ...
};
struct Derived2: POD
{
Derived2(): kind(Kind_Derived2) {}
int GetFoo();
int GetBar();
int GetBaz();
int GetXyzzy();
// ... plus other type-specific data and function members ...
};
struct Derived3: POD
{
Derived3(): kind(Kind_Derived3) {}
int GetFoo();
int GetBar();
int GetBaz();
int GetXyzzy();
// ... plus other type-specific data and function members ...
};
// ... and so on for other derived classes ...
और फिर POD
वर्ग के समारोह के सदस्यों को इस तरह लागू किया जाता है:: यह कुछ इस तरह दिखता
int POD::GetFoo()
{
// Call kind-specific function
switch (kind)
{
case Kind_Derived1:
{
Derived1 *pDerived1 = static_cast<Derived1*>(this);
return pDerived1->GetFoo();
}
case Kind_Derived2:
{
Derived2 *pDerived2 = static_cast<Derived2*>(this);
return pDerived2->GetFoo();
}
case Kind_Derived3:
{
Derived3 *pDerived3 = static_cast<Derived3*>(this);
return pDerived3->GetFoo();
}
// ... and so on for other derived classes ...
default:
throw UnknownKindException(kind, "GetFoo");
}
}
POD::GetBar()
, POD::GetBaz()
, POD::GetXyzzy()
, और अन्य सदस्यों इसी तरह लागू किया जाता है।
यह उदाहरण सरलीकृत है। वास्तविक कोड में POD
, और कुछ दर्जन विधियों के लगभग दर्जन विभिन्न उपप्रकार हैं। POD
के नए उपप्रकार और नए तरीके बहुत बार जोड़े जाते हैं, और इसलिए जब भी हम ऐसा करते हैं, तो हमें इन सभी switch
कथन अपडेट करना होगा।
POD
कक्षा में फ़ंक्शन सदस्यों virtual
को घोषित करने का सामान्य तरीका होगा, लेकिन हम ऐसा नहीं कर सकते क्योंकि ऑब्जेक्ट साझा स्मृति में रहते हैं। बहुत सारे कोड हैं जो इन structs पर सादे-पुराने डेटा होने पर निर्भर करते हैं, इसलिए यदि मैं साझा-स्मृति वस्तुओं में वर्चुअल फ़ंक्शंस रखने का कोई तरीका समझ सकता हूं, तो मैं ऐसा नहीं करना चाहूंगा।
तो, मैं इसे साफ करने के सर्वोत्तम तरीके के रूप में सुझावों की तलाश कर रहा हूं ताकि उप-प्रकार के तरीकों को कॉल करने के बारे में सभी ज्ञान एक स्थान पर केंद्रीकृत हो, बजाय दो दर्जन switch
विवरणों में बिखरे हुए जोड़े दर्जन कार्यों।
मेरे लिए क्या होता है कि मैं कुछ प्रकार के एडाप्टर वर्ग बना सकता हूं जो POD
को लपेटता है और अनावश्यकता को कम करने के लिए टेम्पलेट का उपयोग करता है। लेकिन इससे पहले कि मैं उस रास्ते को शुरू कर दूं, मैं जानना चाहूंगा कि दूसरों ने इसका सामना कैसे किया है।
तुमने कहा था एक बहुत वहाँ था इस वर्ग के आधार पर कोड का। क्या आप इसमें फ़ील्ड जोड़ सकते हैं, या क्या संरचना को वही रहने की आवश्यकता है? –
संरचना मूल रूप से वही रहनी चाहिए। हमारे पास साझा स्मृति में इन चीजों के विशाल सरणी का एक गुच्छा है, और पहले से ही स्मृति-आकार सीमाओं में बंपिंग कर रहे हैं। –
क्या सभी एकाधिक प्रक्रियाओं में लाइब्रेरी का सटीक संस्करण है, या नहीं? –