के बीच एक परिपत्र निर्भरता को हल करना मेरे पास दो वर्ग, Foo<T>
और Bar<T>
हैं, जो Base
से व्युत्पन्न हैं। प्रत्येक virtual Base* convert(ID) const
विधि को ओवरराइड करता है, जहां ID
एक प्रकार का उदाहरण है जो विशिष्ट रूप से Foo
या Bar
(विशेष रूप से enum
) का एक विशेष तत्काल पहचानता है। समस्या यह है कि Foo::convert()
को Bar
उदाहरण वापस करने में सक्षम होना आवश्यक है, और इसी प्रकार Bar::convert()
को Foo
को तुरंत चालू करने में सक्षम होना आवश्यक है। चूंकि वे दोनों टेम्पलेट्स हैं, इसलिए यह Foo.h
और Bar.h
के बीच एक परिपत्र निर्भरता में परिणाम देता है। मैं इसका कैसे समाधान करूं?टेम्पलेट क्लासेस
संपादित करें: एक आगे घोषणा काम नहीं करता है, क्योंकि प्रत्येक विधि के क्रियान्वयन अन्य वर्ग के निर्माता की जरूरत है:
Foo.h
:
#include <Base.h>
template<class T> class Bar;
template<class T>
class Foo : public Base { ... };
template<class T>
Base* Foo<T>::convert(ID id) const {
if (id == BAR_INT)
return new Bar<int>(value); // Error.
...
}
Bar.h
:
#include <Base.h>
template<class T> class Foo;
template<class T>
class Bar : public Base { ... };
template<class T>
Base* Bar<T>::convert(ID id) const {
if (id == FOO_FLOAT)
return new Foo<float>(value); // Error.
...
}
त्रुटि, स्वाभाविक रूप से, "अपूर्ण प्रकार का अमान्य उपयोग" है।
चक्रीय निर्भरता शायद ही कभी एक अच्छा विचार कर रहे हैं। इसे पुन: सक्रिय करने का प्रयास करें ताकि निर्भरता टूट गई हो। पहला विचार 'कन्वर्ट' विधि को एक फ्री फ़ंक्शन में ले जायेगा जो 'बार' और 'फू' दोनों पर निर्भर करता है ... –