خطای invalid use of incomplete type در c++ - هفت خط کد انجمن پرسش و پاسخ برنامه نویسی

خطای invalid use of incomplete type در c++

0 امتیاز

سلام .من کد زیر را نوشتم ظاهراْ همه چیز درسته ولی خوب خطا میده کسی می تونه ابراد کد را پیدا کنه؟

دقیق بخوام بگم خطای زیر را میده:

main.cpp:46:21: error: invalid use of incomplete type ‘struct ILockManager’

#include <stdio.h>
#include <set>
#include <iostream>
#include <string>
#include <sstream>

using namespace std;

struct  ILockManager;
struct ILifeSpan{
    ILifeSpan(ILockManager* lock_manager):
    lock_manager_(lock_manager){
    }
    
    ~ILifeSpan(){}
    
    virtual void write2Stream() = 0;
    virtual void loadFromStream() = 0;
    
    
    std::string date_;
    ILockManager* lock_manager_;
    virtual ILockManager* lockManager(){
        return lock_manager_;
    }
};

struct HLockManager;
struct HLifeSpan : public ILifeSpan{
    HLifeSpan(ILockManager* lock_manager):
    ILifeSpan(lock_manager){
        
    }
    
   ~HLifeSpan(){}
   
   virtual void write2Stream() override{
       lock_manager_->write(date_.c_str(),9);
   }
   
   virtual void loadFromStream() override{
      lock_manager_->read(date_,9);
   }
   
    // virtual HLockManager* lockManager(){
    //     return dynamic_cast<HLockManager*>(lock_manager_);
    // }

};


struct ILockManager  {
       virtual ~ILockManager(){}
    void write(const char* value,int length){
        ss_.write(value,length);
    }
    
    void read(char* value,int length){
        ss_.read(value,length);
    }
    std::stringstream ss_;
    
    void print(){
        cout << ss_.str() << endl;
    }
    
    
    ILifeSpan* ls_;
    
    void save(){
        ls_->write2Stream();
    }
    

};

template <typename LS>
struct TLockManager : public ILockManager{
    
    TLockManager(){
        ls_ = new LS(this);
    }
};
struct HLockManager:public TLockManager<HLifeSpan>{
    HLockManager():TLockManager<HLifeSpan>(){}
};

int main()
{
    HLockManager lock_m;
    lock_m.ls_->date_ = "1200/2/2";
    lock_m.save();
    lock_m.print();
    
    return 0;
}

 

سوال شده مرداد 27, 1399  بوسیله ی .bahman (امتیاز 137)   3 18 24
ویرایش شده مرداد 27, 1399 بوسیله ی مصطفی ساتکی

1 پاسخ

+1 امتیاز
در کد شما وابستگی دو طرفه وجود داره و اگر در وابستگی دو طرفه forward declaration‌ استفاده کنید مجاز به ساخت یا استفاده از متدها نیستید راه حل هم استفاده از سورس فایل برای پیاده سازی کلاس ها پیشنهاد میشه.
پاسخ داده شده مرداد 27, 1399 بوسیله ی مصطفی ساتکی (امتیاز 21,998)   24 34 75
...