Добрый вечер.Помогите пожалуйста, Прокомментируйте и объясните код ..Можно ли этот код сделать намного проще и понятней?
Файл One_Class.cpp:
Код:
#include <vector>
#include "../Defs.h"
using namespace std;
using namespace Defs_ns;
int ONE_Class::m_errno = -1;
static ONE s_one("D:\\bbb.xml", "D:\\Objects.xml");
SomeClass ONE_Class::one_new ( int &id)
{
SomeClass* pCls = new SomeClass();
memset(pCls, 0, sizeof(SomeClass));
id = s_one.Append(pCls, sizeof(SomeClass));
return *pCls;
}
SomeClass ONE_Class::one_get ( int id )
{
std::string& buf = s_one.Get(id);
const char* d = buf.data();
return *(SomeClass*)d;
}
bool ONE_Class::one_remove ( int id )
{
s_one.Remove(id); // no reason to return boolean value
return true;
}
SomeClass ONE_Class::one_save ( int id, const SomeClass& cls )
{
std::string& buf = s_one.Get(id);
SomeClass retVal;
memcpy(&retVal, buf.data(), sizeof(SomeClass));
buf.assign((char*)&cls, sizeof(SomeClass));
s_one.Serialize();
return retVal;
}
int ONE_Class::one_get_count ( )
{
return s_one.GetSize();
}
int ONE_Class::one_get_errno ( )
{
return m_errno;
}
Файл defs.h
Код:
# pragma once
#include <string>
#include <comdef.h>
namespace Defs_ns {
inline void PrintError(const std::string& msg)
{
throw std::runtime_error(msg);
}
//------------------------------------------------------------------------
void DoSplitPath(const std::string& path, std::string& dir, std::string& fName, std::string& ext);
} // namespace Defs_ns
Файл defs.cpp
Код:
#include "Defs.h"
using namespace std;
namespace Defs_ns{
void DoSplitPath(const string& path, string& dir, string& fName, string& ext)
{
assert(!path.empty());
dir.clear();
fName.clear();
ext.clear();
// split the 'path'
static const size_t NULL_CHAR = sizeof(char);
char driveBuf[_MAX_DRIVE + NULL_CHAR];
char dirBuf[_MAX_DIR + NULL_CHAR];
char nameBuf[_MAX_FNAME + NULL_CHAR];
char extBuf[_MAX_EXT + NULL_CHAR];
errno_t res = _splitpath_s(path.c_str(), driveBuf, _MAX_DRIVE, dirBuf, _MAX_DIR, nameBuf, _MAX_FNAME, extBuf, _MAX_EXT);
if ( res )
PrintError("Failed to split path");
// build directory from 'path'
char buff[_MAX_PATH + NULL_CHAR];
res = sprintf_s(buff, _MAX_PATH, "%s%s", driveBuf, dirBuf);
if ( res == -1 )
PrintError("Fail to create directory");
else
dir.assign(buff);
fName.assign(nameBuf);
ext.assign(extBuf);
assert(!dir.empty());
assert(!fName.empty());
assert(!ext.empty());
}
и файл ONE_Class.h
Код:
#pragma once
#include "SomeClass.h"
class ONE_Class : public SomeClass{
public:
/**
* Создание нового объекта
*/
static SomeClass one_new ( int &id);
/**
* Считывание объекта по идентификатору
*/
static SomeClass one_get ( int id );
/**
* Удаление объекта по идентификатору
*/
static bool one_remove ( int id );
/**
* Сохранение класса
*/
static SomeClass one_save ( int id, const SomeClass& );
/**
* Возвращает число хранимых объектов
*/
static int one_get_count ( );
/**
* Возвращает значение кода возврата
*/
static int one_get_errno ( );
private:
static int m_errno; // код возврата последней операции
};
В SomeClasse описан любой класс без значений , например:
Код:
class SomeClass
{
public:
// функции
SomeClass ();
void func_1 ( int );
void func_2 ( float ) const;
// свойства
int v1;
int v2;
private:
// функции
void func_3 ( char );
// свойства
int v3;
public:
// свойства
int v4;
};