Как поместить структуру в вектор (vector)
А конкретно есть следующая задача:
Нужно реализовать класс который буферы в структуру SecBufferDesc;
Вот необходимые структуры:
typedef struct _SecBuffer {
unsigned long cbBuffer; // Size of the buffer, in bytes
unsigned long BufferType; // Type of the buffer (below)
void SEC_FAR * pvBuffer; // Pointer to the buffer
} SecBuffer, SEC_FAR * PSecBuffer;
typedef struct _SecBufferDesc {
unsigned long ulVersion; // Version number
unsigned long cBuffers; // Number of buffers
#ifdef MIDL_PASS
[size_is(cBuffers)]
#endif
PSecBuffer pBuffers; // Pointer to array of buffers
} SecBufferDesc, SEC_FAR * PSecBufferDesc;
Для этого я реализую следующий класс:
class SecurityBufferDescriptor
{
public:
void AddBuffer(PVOID start, DWORD size, DWORD type)
{
PSecBuffer secBuffer = new SecBuffer;;
secBuffer->BufferType = type;
secBuffer->cbBuffer = size;
secBuffer->pvBuffer = start;
// Вот тут вся загвоздка!!!
// Как мне теперь secBuffer загнать в buffers_?
buffers_.insert(buffers_.begin(), (PBYTE) secBuffer, (PBYTE) secBuffer + sizeof(*secBuffer));
}
SecBufferDesc *operator()()
{
desc_.cBuffers = buffers_.size();
desc_.pBuffers = &buffers_[0];
desc_.ulVersion = SECBUFFER_VERSION;
return &desc_;
}
private:
std::vector<SecBuffer> buffers_;
SecBufferDesc desc_;
};
Как в функции AddBuffer() добавлять SecBuffer'ы к вектору buffers_?
Код:
buffers_.push_back(secBuffer);
не подходит разве?
Цитата: mohito
Нужно добавить структуру SecBuffer (на самом деле это не важно, важен принцип) в vector
А конкретно есть следующая задача:
Нужно реализовать класс который буферы в структуру SecBufferDesc;
Вот необходимые структуры:
typedef struct _SecBuffer {
unsigned long cbBuffer; // Size of the buffer, in bytes
unsigned long BufferType; // Type of the buffer (below)
void SEC_FAR * pvBuffer; // Pointer to the buffer
} SecBuffer, SEC_FAR * PSecBuffer;
А конкретно есть следующая задача:
Нужно реализовать класс который буферы в структуру SecBufferDesc;
Вот необходимые структуры:
typedef struct _SecBuffer {
unsigned long cbBuffer; // Size of the buffer, in bytes
unsigned long BufferType; // Type of the buffer (below)
void SEC_FAR * pvBuffer; // Pointer to the buffer
} SecBuffer, SEC_FAR * PSecBuffer;
А зачам называть поле структуры cbBuffer, а потом давать коменнтарий, т.е. расшифровывать название?
Почему бы сразу не назвать поле bufferSize ?
Остальные комментарии тоже бессмысленны. Сокращай число комментариев в коде.
Цитата: mohito
typedef struct _SecBufferDesc {
unsigned long ulVersion; // Version number
unsigned long cBuffers; // Number of buffers
#ifdef MIDL_PASS
[size_is(cBuffers)]
#endif
PSecBuffer pBuffers; // Pointer to array of buffers
} SecBufferDesc, SEC_FAR * PSecBufferDesc;
Аналогично:
ulVersion - versionNumber
cBuffers - buffersNumber
pBuffers - buffersArray
Цитата: mohito
Для этого я реализую следующий класс:
class SecurityBufferDescriptor
{
public:
void AddBuffer(PVOID start, DWORD size, DWORD type)
{
PSecBuffer secBuffer = new SecBuffer;;
secBuffer->BufferType = type;
secBuffer->cbBuffer = size;
secBuffer->pvBuffer = start;
// Вот тут вся загвоздка!!!
// Как мне теперь secBuffer загнать в buffers_?
buffers_.insert(buffers_.begin(), (PBYTE) secBuffer, (PBYTE) secBuffer + sizeof(*secBuffer));
}
Зачем new?
И используй push_back.
Код:
void AddBuffer(PVOID start, DWORD size, DWORD type)
{
SecBuffer secBuffer;
secBuffer.BufferType = type;
secBuffer.cbBuffer = size;
secBuffer.pvBuffer = start;
buffers_.push_back(secBuffer);
}
{
SecBuffer secBuffer;
secBuffer.BufferType = type;
secBuffer.cbBuffer = size;
secBuffer.pvBuffer = start;
buffers_.push_back(secBuffer);
}
А ещё будет удобно, если ты создашь конструктор структуры SecBuffer с соотв. параметрами.
Цитата: mohito
SecBufferDesc *operator()()
{
desc_.cBuffers = buffers_.size();
desc_.pBuffers = &buffers_[0];
desc_.ulVersion = SECBUFFER_VERSION;
return &desc_;
}
А вот за это, вообще, надо руки отрывать.
Что ты деаешь этим кодом?
Формируешь SecBufferDesc ? Тогда почему возвращается указатель на поле класса?
Возвращаешь указатель на поле класса? Зачем? Чтоб состояние твоего объекта могли неконтролируемо изменить извне?
Ты уж либо создавай новый объект
Код:
SecBufferDesc operator()()
{
SecBufferDesc desc;
desc.cBuffers = buffers_.size();
desc.pBuffers = &buffers_[0];
desc.ulVersion = SECBUFFER_VERSION;
return desc;
}
{
SecBufferDesc desc;
desc.cBuffers = buffers_.size();
desc.pBuffers = &buffers_[0];
desc.ulVersion = SECBUFFER_VERSION;
return desc;
}
либо возвращай константный указатель:
Код:
const SecBufferDesc *operator()();
P.S. И форматируй код в постах тегом [noparse]
Код:
Green - структуры SecBuffer и SecBufferDesc - они не мои, они из Security.h эти коменты привет от Майкрософта;)