hər şeydən əvvəl demək istəyirəm ki, bu cür sualın əvvəllər də verildiyini bilirəm (məsələn, burada Şablon Sinfləri Arasında Dairəvi Asılılığın Həlli Edilməsi).
Bununla belə, bu həll (bəyannaməni icradan ayırmaq) yalnız hər iki sinfi bir fayla yerləşdirərkən işləyir. Mənim vəziyyətimdə, hər ikisi kifayət qədər böyük və böyüməyə zəmanət verən bir StateManager və Dövlət sinifinə sahibəm. Beləliklə, onların bir böyük faylda olması mənim üçün qeyri-qənaətbəxş görünür.
Burada bəzi vacib kod parçaları:
// 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;
}
Burada RequestStackPush()
metodunun həyata keçirilməsi
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);
}
Aydındır ki, StateManager
həmişə State
sinifindən istifadə edir. Bu, metodları çağırır və s. yaradır, buna görə irəli bəyannamə burada heç bir həll yolu deyil. Sadəcə sizə bir misal çəkmək üçün:
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));
}
Hazırda hər iki sinif bir böyük fayldadır. Birincisi, StateManager
ilə State
sinifinin elanı, ardınca StateManager
sinifinin elanı, ardınca yuxarıda təsvir edilən State::RequestStackPush()
metodunun tətbiqi və nəhayət, bütün StateManager şablon metodlarının həyata keçirilməsi.
Bunu iki fərqli fayla necə ayıra bilərəm?
StateManager
istinad vəRequestStackPush
metodunu sadəcə silməyi düşünmüsünüz? Bu, kodunuzun qalan hissəsi üçün nə qədər pis olardı? - person Sebastian Redl   schedule 14.12.2017