Я только что узнал из этого Q / эти структуры наследуются в C ++, но является ли это хорошей практикой или предпочтительнее использовать классы? В каких случаях предпочтительнее, а в каких нет?
Я никогда не нуждался в этом, но теперь у меня есть куча сообщений разных типов, но с одинаковой долготой. Я получил их в двоичном виде в массиве char, и я просто копирую их с помощью memcpy в структуру, чтобы заполнить ее поля (я не знаю, возможно ли вообще сделать это с помощью std :: copy).
Я думаю, было бы здорово иметь возможность наследовать каждую структуру от базовой структуры с общими заголовками, поэтому я искал это. Итак, второй вопрос: если я сделаю это с классами, возможно ли сделать memcpy (или std: copy) из буфера в класс?
Можно ли использовать побитовую копию или нет, это не имеет ничего общего с 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);
Единственная разница между struct
а также class
является модификатором доступа по умолчанию для его членов. В struct
его public
И в class
его private
(пока не указано иное). Кроме того struct
а также class
идентичны в C ++.
Иногда структуры для PDO (Plain Data Objects) предпочтительнее, чем классы для удобства чтения, но на самом деле это соответствует соглашению о кодировании.