Копирование/перемещение структуры в другую

Когда вам не нужно иметь дело с указателями, скопировать/переместить структуру в другую довольно просто.
Однако в моем случае мне приходится иметь дело с указателями и правами доступа.

protected:
          addrinfo *hints, *result;
...
hints = new addrinfo;
...
getaddrinfo(0, port.c_str(),  hints, &result); // result is protected - can't do that.

memmove/memcpy можно использовать, но addrinfo содержит внутри себя указатель на sockaddr. Я думал использовать временную структуру для передачи getaddrinfo, а затем переместить все в result, но вопрос всегда остается.
Скажите, если вам нужны какие-то другие подробности.

РЕДАКТИРОВАТЬ: @Mike Woolf, ты дал мне идею. Поскольку базовый класс является абстрактным, я могу даже сделать эти структуры общедоступными, поскольку у пользователя не будет возможности их идентифицировать. Однако спасибо за ответ.


person edmz    schedule 01.02.2014    source источник
comment
Начнем с очевидного вопроса: если вам нужен публичный доступ к результату, почему бы не сделать его публичным или не предоставить публичный метод доступа?   -  person Mike Woolf    schedule 01.02.2014


Ответы (1)


В таком случае я бы написал свою собственную функцию копирования. Это может быть что-то вроде

void structCopy(struct* dest, const struct* src);

Внутри этой функции используйте memcpy(), чтобы скопировать все, кроме указателей.

Мне приходилось делать что-то подобное, когда я делал многопользовательскую игру — вот так копировать указатели. В такого рода шаблонах обычно предполагается, что это функция, которая точно понимает, что она должна делать, то есть structCopy() специально разработана для этой конкретной структуры. Таким образом, он знает, что внутри объекта есть sockaddr.

Так что на самом деле просто жестко закодируйте внутри этой функции, как вы хотите с ней обращаться. Вы хотите, чтобы он создал новый sockaddr на другом конце? Затем попросите функцию копирования сделать это. Или что работает.

TL;DR — Создайте специальную функцию копирования для вашей структуры, которая знает, что находится внутри структуры, и пусть она обрабатывает sockaddr в соответствии с вашими спецификациями. Сделав его частью класса (или дружественной функцией), вы не нарушите никаких правил, жестко запрограммировав функцию.

person Philip    schedule 01.02.2014