Когда вам не нужно иметь дело с указателями, копирование / перемещение структуры в другую довольно просто.
В моем случае, однако, я имею дело с указателями и правами доступа.
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
, но вопрос всегда есть.
Скажите мне, если вам нужны другие детали.
РЕДАКТИРОВАТЬ: @ Майк Вульф, вы дали мне идею. Поскольку базовый класс является абстрактным, я даже могу сделать эти структуры общедоступными, поскольку у пользователя не будет возможности его истолковать. Однако спасибо за ответ.
В таком случае я бы написал свою собственную функцию копирования. Это может быть что-то вроде
void structCopy(struct* dest, const struct* src);
Внутри этой функции используйте memcpy () для копирования всего, кроме указателей.
Мне приходилось делать что-то подобное, когда я создавал многопользовательскую игру, копируя указатели, подобные этой. В этом типе паттерна обычно предполагается, что это функция, которая точно понимает, что она должна делать, то есть structCopy () специально разработана для этой конкретной структуры. Так что известно, что внутри объекта есть sockaddr.
Так что на самом деле, просто жестко запрограммируйте внутри этой функции то, как вы хотите с ней справиться. Вы хотите, чтобы он создал новый sockaddr на другом конце? Затем сделайте это с помощью функции копирования. Или все, что работает.
TL; DR — Создайте специальную функцию копирования для вашей структуры, которая знает, что находится внутри структуры, и должна обрабатывать sockaddr в соответствии с вашими спецификациями. Делая его частью класса (или функции друга), вы не нарушаете никаких правил, жестко программируя функцию.
Других решений пока нет …