सर्वप्रथम, मला असे म्हणायचे आहे की मला माहिती आहे की या प्रकारचा प्रश्न यापूर्वी विचारला गेला आहे (उदा. येथे टेम्पलेट वर्गांमधील परिपत्रक अवलंबित्व सोडवणे).
तथापि, हे समाधान (अंमलबजावणीपासून घोषणा वेगळे करणे) दोन्ही वर्ग एकाच फाईलमध्ये टाकल्यावरच कार्य करते. माझ्या बाबतीत, माझ्याकडे स्टेट मॅनेजर आणि स्टेट क्लास आहे जे दोन्ही बऱ्यापैकी मोठे आहेत आणि वाढण्याची हमी आहे. अशा प्रकारे ते एका मोठ्या फाईलमध्ये असणे माझ्यासाठी असमाधानकारक वाटते.
येथे काही महत्त्वाचे कोड स्निपेट्स आहेत:
// Forward declare the StateManager --> does not work (incomplete type)
class State
{
public:
template <class TData>
void RequestStackPush(ID stateId, std::shared_ptr<TData> data);
private:
StateManager & stataManager;
}
येथे RequestStackPush()
पद्धतीची अंमलबजावणी आहे
template<class TData>
inline void State::RequestStackPush(ID stateId, std::shared_ptr<TData> data)
{
// Uses the state manager's PushState() method - here the issue with the incomplete type arises
stateManager.PushState<TData>(stateId, data);
}
अर्थात, StateManager
सर्व वेळ State
वर्ग वापरते. तो तयार करतो त्याला मेथड्स वगैरे म्हणतात. त्यामुळे फॉरवर्ड डिक्लेरेशन इथे उपाय नाही. फक्त तुम्हाला एक उदाहरण देण्यासाठी:
template<class TData>
inline void StateManager::PushState(State::ID stateId, std::shared_ptr<TData> data)
{
std::unique_ptr<BasePendingChange> pendingChange = std::make_unique<PendingPushDataChange<TData>>(Push, stateId, data);
pendingChangeQueue.push(std::move(pendingChange));
}
सध्या, दोन्ही वर्ग एकाच मोठ्या फाईलमध्ये आहेत. प्रथम, State
वर्गाची घोषणा StateManager
पुढे घोषित करून त्यानंतर StateManager
वर्गाची घोषणा त्यानंतर वर वर्णन केलेल्या State::RequestStackPush()
पद्धतीची अंमलबजावणी आणि शेवटी सर्व राज्यव्यवस्थापक टेम्पलेट पद्धतींची अंमलबजावणी.
मी हे दोन वेगवेगळ्या फायलींमध्ये कसे वेगळे करू शकतो?
StateManager
संदर्भ आणिRequestStackPush
पद्धत काढून टाकण्याचा विचार केला आहे का? तुमच्या उर्वरित कोडसाठी ते किती वाईट असेल? - person Sebastian Redl   schedule 14.12.2017