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

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

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, но вопрос всегда есть.
Скажите мне, если вам нужны другие детали.

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

0

Решение

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

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

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

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

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

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

1

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

Других решений пока нет …

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