Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Как поместить структуру в вектор (vector)

8.2K
27 января 2008 года
mohito
35 / / 24.11.2005
Нужно добавить структуру 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;

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_?
92
27 января 2008 года
Тень Пса
2.2K / / 19.10.2006
а стандартно
 
Код:
buffers_.push_back(secBuffer);


не подходит разве?
3
27 января 2008 года
Green
4.8K / / 20.01.2000
Цитата: 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;


А зачам называть поле структуры 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 с соотв. параметрами.

Цитата: 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;
}

либо возвращай константный указатель:
 
Код:
const SecBufferDesc *operator()();


P.S. И форматируй код в постах тегом [noparse]
 
Код:
 
[/noparse]
.
8.2K
27 января 2008 года
mohito
35 / / 24.11.2005
Тень Пса - спасибо, так и сделал, просто уже тупить начинаю, просмотрел, что у меня уже определен вектор этих структур... уже > 120 часов пишу код с перерывами только на сон и еду... бррр... =)

Green - структуры SecBuffer и SecBufferDesc - они не мои, они из Security.h эти коменты привет от Майкрософта;)
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог