Keresés

Új hozzászólás Aktív témák

  • jattila48

    aktív tag

    válasz EQMontoya #3073 üzenetére

    "Amivel olvasol (legyen source), az legyen egy külön osztály, valami interface-szel. Ebből lehet leszarmaztatni sok félét"

    Ezzel ugyan az a gond, mint az én megoldásomban. Az interface hogyan kapja meg a forrástól a blob-ot? A leszármazott osztály ctor-ának ugyanúgy meg kell hívni az intarface egy nem virtuális init_blob tfv.-ét, amivel ezt megteszi. Az interface-nek nem lehet a blob beolvasásra virtuális tfv.-e, mert a források különböző paraméterezést igényelnének erre (másrészt az interface ctor-ából nem szokás virtuális tfv.-t hívni). De ha lehetne is virtuális tfv.-e a forrás beolvasására, akkor is előbb létre kéne hozni az objektumot, majd meghívni rá a virtuális read-et (kétfázisú inicializálás). Gondolom az interface itt sem lenne példányosítható (hiszen ezért interface).
    Valahogy így gondoltad?

    class SourceRead{
    public:
    SourceRead():blob_ptr(0),blob_length(0){}
    bool read(){
    return read_blob(&blob_ptr,&blob_length);
    }
    virtual ~SourceRead()=0{}
    void * get_blob_ptr(){return blob_ptr;}
    DWORD get_blob_length(){return blob_length;}
    private:
    virtual bool read_blob(void **blob_ptr,DWORD *blob_length)=0;
    void *blob_ptr;
    DWORD blob_length;
    };

    class SourceReadFile : public SourceRead{
    public:
    SourceReadFile(const std::string & source_name):source_name(source_name){}
    ~SourceReadFile(){/*megnyitott fajl lezarasa, allokalt memoria felszabaditasa*/}
    private:
    virtual bool read_blob(void **blob_ptr,DWORD *blob_length){
    //source_name forras megnyitasa,beolvasando meret meghatarozasa, *blob_ptr=allokalt memoria cime,blob_length=merete
    return true;
    }
    const std::string & source_name;
    };

    class BlobProcess{
    public:
    BlobProcess(std::shared_ptr<SourceRead> sp):source_read_shared_ptr(sp){process_blob(sp->get_blob_ptr(),sp->get_blob_length);}
    private:
    void process_blob(void *,DWORD);
    std::shared_ptr<SourceRead> source_read_shared_ptr;
    };

    void main(){
    auto source_read_file=std::make_shared<SourceReadFile>(new SourceReadFile("blob_file"));
    source_read_file->read(); //ketfazisu inicializalas
    BlobProcess blob_process(source_read_file);
    }

    És itt már nem 2, hanem 3 osztály van, meg shared_ptr (tényleg! miért nem unique_ptr), amit nagyon nem szívesen használok. Ezzel szembem nálam 2 osztály van, amiből csak 1-et kell példányosítani, és nincs shared_ptr (sem_unique_ptr).

Új hozzászólás Aktív témák