попытка реализовать дереаво каталогов и файлов
От: Seregik  
Дата: 09.10.02 17:33
Оценка:
// Тут примерно такая идея
// Короче это попытка реализовать дереаво каталогов и файлов
// Что не так?
// А имею ввиду подход к проблемме.


template <class T> class cList 
{
public:
    T* pItem;
    cList<T> *pNext; //Указатель на следующий элемент

    cList(){...};
    ~cList(){
        cList<T>*ptr=this;
        if (ptr->pNext)
            delete (cList<T> *)ptr->pNext;
        delete (T*)pItem;
    };

    // Ну тут разные функции типа Add(...) Find(...)
}

class cFileRecord
{
    char* name;

public:
    char* atr; //некий признак дирректории
    cFileRecord(){...};
    ~cFileRecord(){
        Delete();
        };
    virtual void Delete()=0;
}

class cFolder: public cFileRecord
{
    cList<cFileRecord>pChild;
public:
    cFolder(char* nm){
        name=nm;
        pChild=NULL;
        atr="dir";
    }

    void AddChild(cFileRec& ps){
        if (pChild==NULL)
            pChild=new cList<cFileRec>;
        pChild->Add(ps);
    };

    Delete(){
        if(pChild->pItem->sAtr[0]='d')
            delete (cDir*)pChild;
        else
         delete (cList<cFileRec>*)pChild;
    }

};

class cMemFile:public cFileRecord
{
    char *buff;
public:
    cMemFile(char *nm){
        name=nm;
        buff=NULL;
        atr="file";
    }
    Delete(){
        if (buff)
            free(buff);
    }
}

int main(int argc, char* argv[])
{
  
    cDir* pRootDir=new cDir("root");

    cDir* p_dir=new cDir("d00");
    pRootDir.AddChild(new cMemFile("f00"));
    pRootDir.AddChild(new cMemFile("f01"));
    pRootDir.AddChild(new cDir("d01"));
    p_dir.AddChild(new cDir("d10")
    pRootDir.AddChild(new cMemFile("f10"));
    pRootDir.AddChild(new cMemFile("f11"));
    // и т. д. ...
    
    
    // a вот как теперь сделать вот это
    delete pRootDir;

}
Re: попытка реализовать дереаво каталогов и файлов
От: Seregik  
Дата: 09.10.02 19:27
Оценка:
Извиняюсь первый раз я очень небркжно подошол и к изложению вопроса
Сделал очень много ошибок.
Теперь надеюсь более точно выразился

В общем правильно ли я построил структуру программы, в смысле наследоания, использования шаблонов и виртуальных функций?

ВЫ мозги нашего общества, создавая дерево каталогов и файлов, сделали бы также или нет?
Никаких стандaртных list, tree, file и т.д. в моей системе применить нельзя.



template <class T> class cList 
{
public:
    T* pItem;
    cList<T> *pNext; //Указатель на следующий элемент

    cList(){};
    ~cList(){
        cList<T>*ptr=this;
        if (ptr->pNext)
            delete (cList<T> *)ptr->pNext;
        delete (T*)pItem;
    };
    
          // Ну тут разные функции типа Add(...) Find(...)

    void Add(T*pi){};
};

class cFileRecord
{
public:    
    char* name;
    char* atr; 
    cFileRecord(){};
    ~cFileRecord(){
        Delete();
        };
    virtual void Delete(){};
};

class cFolder: public cFileRecord
{
    cList<cFileRecord>* pChild;
public:
    cFolder(char* nm){
        name=nm;
        pChild=NULL;
        atr="dir";
    };

    void AddChild(cFileRecord* ps){
        if (pChild==NULL)
            pChild=new cList<cFileRecord>;
        pChild->Add(ps);
    };

    void Delete(){
        if(pChild->pItem->atr[0]='d')
            delete (cFolder*)pChild;
        else
         delete (cList<cFileRecord>*)pChild;
    };

};

class cMemFile:public cFileRecord
{
    char *buff;
public:
    cMemFile(char *nm){
        name=nm;
        buff=NULL;
        atr="file";
    }
    void Delete(){
        if (buff)
            free(buff);
    }
};

int main(int argc, char* argv[])
{
  
    cFolder* pRootDir=new cFolder("root");

    cFolder* p_dir=new cFolder("d00");

    pRootDir->AddChild(new cMemFile("f00"));
    pRootDir->AddChild(new cMemFile("f01"));
    pRootDir->AddChild(new cFolder("d01"));
    p_dir->AddChild(new cFolder("d10"));
    pRootDir->AddChild(new cMemFile("f10"));
    pRootDir->AddChild(new cMemFile("f11"));

    delete pRootDir;
    return 0;
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.