Помогите создать фабрику классов
От: SL555 Россия  
Дата: 25.01.08 08:18
Оценка:
Здравствуйте такой вопрос, есть класс:

struct IEntity
{
    virtual void AssertValid() = 0;
    virtual void    Fetch           (ADODB::_RecordsetPtr rs) = 0;
    virtual CString GetInsertStmt   () const = 0;
    virtual CString GetUpdateStmt   () const = 0;
    virtual CString GetDeleteStmt   () const = 0;
    virtual cXmlNode * GetXMLData()  = 0;
    virtual void SetXMLData(cXmlNode *pNode)=0;
};


есть классы которые его наследует:

struct cType:public IEntity
{
.................
}
typedef std::vector<cType> cTypes; 

struct cUser:public IEntity
{
................
}
typedef std::vector<cUser> cUsers;


И вот к примеру есть такая функция:

template <typename Entity>
cXmlFile *CreateXMLFile(CString & database, CString & table, CString &sql, std::vector<Entity> &data){

    try{
       Db db(database,GetPassowrd());
       db.Fetch( data,sql);
    }catch(_com_error &err){
        LogException(err);
         return NULL;
    }
    if( !data.size()){

        return NULL;
    }
    cXmlFile *pFile=new cXmlFile(table.GetBuffer());
    cXmlNode *pRoot;
    pRoot=pFile->root();

    for(int i=0;i<(int)data.size();++i){
        Entity e=data[i];
        pRoot->add_node(e.GetXMLData());
    }
    return pFile;
}

 cXmlFile * cDbManager::GetValueEntity( const CString &database, const CString& table_name,const CString &sql)const
{
    CString tDatabase=database;
    CString tTable=table_name;
    CString tSql=sql;
    
  if(table_name=="type"){
                cTypes data;
            return CreateXMLFile(tDatabase,tTable,tSql, data);
         
      }else if(table_name=="user"){
           cUsers data;
           return CreateXMLFile(tDatabase,tTable,tSql, data);

      }
   ..............................................
}


Вот эта запись очень не удобная, хотелось бы сделать, фабрику, но вся беда в том, что как можно сгенерить указатель не на *IEntity, а vector<IEntity>*, или хотя бы vector<IEntity*>*, попробовал так:

typedef std::vector<IEntity*> Entities;
..................................
typedef std::vector<cType*> cpTypes; 


typedef std::vector<cUser*> cpUsers; 
......................................................
 Entities*  cGeneratorEntity::GetEntity(CString &table_name){
     if(table_name=="type"){
         return  reinterpret_cast<Entities*> (new cpType());

     }else if(table_name=="user"){
         return reinterpret_cast<Entities*> (new cpUsers()); 
     }


Без приведения типов, вообще не хочет компилироваться, а с привидением приводиться как раз std::vector<IEntity*> , и требует определить виртуальные функции IEntity
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.