Наследование структур против наследования классов в переполнении стека

Я только что узнал из этого Q / эти структуры наследуются в C ++, но является ли это хорошей практикой или предпочтительнее использовать классы? В каких случаях предпочтительнее, а в каких нет?

Я никогда не нуждался в этом, но теперь у меня есть куча сообщений разных типов, но с одинаковой долготой. Я получил их в двоичном виде в массиве char, и я просто копирую их с помощью memcpy в структуру, чтобы заполнить ее поля (я не знаю, возможно ли вообще сделать это с помощью std :: copy).

Я думаю, было бы здорово иметь возможность наследовать каждую структуру от базовой структуры с общими заголовками, поэтому я искал это. Итак, второй вопрос: если я сделаю это с классами, возможно ли сделать memcpy (или std: copy) из буфера в класс?

4

Решение

Можно ли использовать побитовую копию или нет, это не имеет ничего общего с struct или же class тег и зависит только от того, сказал struct или же class is_trivially_copiable. Определены ли они в Стандарте (9/6 [класс]) и в основном все сводится к тому, что нет необходимости объявлять какие-либо специальные методы-члены, кроме конструкторов.

Затем побитовое копирование разрешается стандартом в 3.9 / 2 [basic.types]

Для любого объекта (кроме подобъекта базового класса) тривиально копируемого типа T, содержит ли объект допустимое значение типа Tнижележащие байты (1.7), составляющие объект, могут быть скопированы в массив char или же unsigned char, Если содержимое массива char или же unsigned char копируется обратно в объект, объект должен впоследствии сохранить свое первоначальное значение. [ Пример:

#define N sizeof(T)
char buf[N];
T obj; // obj initialized to its original value
std::memcpy(buf, &obj, N); // between these two calls to std::memcpy,
// `obj` might be modified
std::memcpy(&obj, buf, N); // at this point, each subobject of `obj`
// of scalar type holds its original value

— конец примера ]

Примечание: побитовая копия байтов заполнения приведет к отчетам в Valgrind.

С помощью std::copy с тем же эффектом:

char const* b = reinterpret_cast<char const*>(&obj);
std::copy(b, b + N, buf);
5

Другие решения

Единственная разница между struct а также class является модификатором доступа по умолчанию для его членов. В struct его public И в class его private (пока не указано иное). Кроме того struct а также class идентичны в C ++.
Иногда структуры для PDO (Plain Data Objects) предпочтительнее, чем классы для удобства чтения, но на самом деле это соответствует соглашению о кодировании.

1

По вопросам рекламы [email protected]