Основная проблема в основном уже решена в другом месте на этом сайте, но что я действительно хочу, так это мнения о том, как лучше всего реализовать мой класс с точки зрения практичности и эстетики, и если есть какие-то тонкости.Имея это в виду, вот мой вопрос:
У меня есть простая программа шифрования, которую я написал, и теперь я хочу добавить к ней сжатие xz, написанное на C. Код xz использует структурудля управления данными в и из алгоритмов сжатия:
/* All of this is in src/liblzma/api/lzma/base.h if you download version 5.0.3
* XZ Utils
*/
typedef struct {
const uint8_t *next_in;
size_t avail_in;
uint64_t total_in;
/* ...
* and so on. Some other members are enums and other structs, but
* this is basically a POD structure
*/
} lzma_stream;
/* This macro is used to initialize lzma_stream objects */
#define LZMA_STREAM_INIT \
{ NULL, 0, 0, NULL, 0, 0, NULL, NULL, \
NULL, NULL, NULL, NULL, 0, 0, 0, 0, \
LZMA_RESERVED_ENUM, LZMA_RESERVED_ENUM }
/* Here's LZMA_RESERVED_ENUM in case anyone's wondering: */
typedef enum {
LZMA_RESERVED_ENUM = 0
} lzma_reserved_enum;
У меня есть класс-оболочка для lzma_stream, так что если мой код шифрования выбрасывает, деструктор класса-оболочки может вызывать функции, которые освобождают любую назначенную память в lzma_streamструктура.Итак, у меня есть:
class Stream {
public:
Stream();
~Stream();
void init();
// ...
private:
lzma_stream stream_;
// ...
};
Stream::~Stream() {
lzma_end( &stream_ );
}
Мой вопрос: как бы вы инициализировали Stream::stream_
и почему?Я мог бы инициализировать членов структуры по отдельности:
Stream::Stream() : stream_(), ... {}
void Stream::init() {
stream_.next_in = NULL;
stream_.avail_in = 0;
// ...
}
Но я бы хотел использовать LZMA_STREAM_INIT
, потому что это означало бы, что мне не нужно беспокоиться об изменениях в библиотеке xz.Имея это в виду, в качестве альтернативы, я мог бы создать temp:
Stream::Stream() : stream_(), ... {}
void Stream::init() {
lzma_stream const temp = LZMA_STREAM_INIT;
stream_ = temp;
// ...
}
Предварительный вопрос: есть ли способ, которым я мог бы выполнить инициализацию в Stream
ctor (править: я имею в виду, в списке инициализации)?(Я так понимаю, не так ли?) Я стараюсь избегать списков инициализации c ++ 0x, кстати, по соображениям переносимости компилятора.
Как я уже говорил выше, это способы решения проблемы.и это уже было сказано в другом месте;но я хотел бы знать, каким образом вы, ребята, будете это делать (если нет другого способа, о котором я не знаю)?Я уже могу догадаться, что вы бы сказали, что последний метод, но у меня есть хитрое чувство, что есть подвох: есть ли?
ОК, много полезной информации и решений, представленных ниже.Спасибо за помощь, ребята.