![]() |
Модераторы: feodorv, GremlinProg, xvr, Fixin |
![]() ![]() ![]() |
|
exploys |
|
|||
Новичок Профиль Группа: Участник Сообщений: 22 Регистрация: 23.4.2009 Репутация: нет Всего: нет |
Упрощенный пример
И собственно два вопроса: 1. Как лучше сделать чтобы при objectA2 = objectA1; копировались не указатели на MyObjectsB, а создавалась собственная копия MyObjectsB для objectA2. Перегрузкой оператора =, отдельной функцией или как-то ещё. 2. При условии, что функция void MyFunc(void) будет вызываться из множества потоков что следует исправить в коде? Подскажите что исправить или посоветуйте литературу, а если и то и то, то вообще будет шикарно. |
|||
|
||||
Rad87 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 10 Регистрация: 26.7.2010 Репутация: нет Всего: нет |
вероятно, описать все это в конструкторе копирования
|
|||
|
||||
xvr |
|
||||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 40 Всего: 223 |
Оператор присваивания и конструктор копирования
Целиком зависит от содержимого этой функции (т.е. от того самого оператора присваивания и конструктора копирования). Самый универсальный способ - критическая секция (но и самый не эффективный по производительности) Это сообщение отредактировал(а) xvr - 20.10.2010, 09:06 |
||||
|
|||||
GremlinProg |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: 99 Всего: 106 |
ну да, вот, кстати xvr тут где-то приводил вариант прокси с критической секцией,
удобнее похоже и не придумать а вот по производительней можно использовать дроссель из семафора, который будет перекрываться полностью при изменении каких-либо указателей (критические изменения в объекте), или просто приоткрываться для определенного потока, если надо его только скопировать единственное, что тут надо предусмотреть, чтобы полное перекрытие было защищено критической секцией, чтобы несколько потоков не могли одновременно вносить критические изменения в объект если сильно интересно, то почитать об этом можно у Харта, например: http://www.williamspublishing.com/Books/5-8459-0879-5.html -------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
|||
|
||||
exploys |
|
||||
Новичок Профиль Группа: Участник Сообщений: 22 Регистрация: 23.4.2009 Репутация: нет Всего: нет |
Спасибо за подсказки.
Создал функцию глубокого копирования void Copy(MyClassA src) и конструктор копирования использующий данную функцию. Здесь все понятно. Вопрос для полноты понимания: как перегрузить оператор = для глубокого копирования (чтобы не перечислять все члены класса, а только те которые нужно скопировать по указателям, как в конструкторе копирования)? Пробовал не получается.
Спасибо буду изучать. А не подскажите как найти "вариант прокси с критической секцией от xvr"? |
||||
|
|||||
GremlinProg |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: 99 Всего: 106 |
1. нажать "поиск" 2. ввести ключевое слово proxy 3. ввести в "фильтр по имени пользователя" xvr 4. нажать "найти" -------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
|||
|
||||
xvr |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 40 Всего: 223 |
||||
|
||||
exploys |
|
|||
Новичок Профиль Группа: Участник Сообщений: 22 Регистрация: 23.4.2009 Репутация: нет Всего: нет |
Спасибо. Классная штука.
А при перегрузке оператора = обязательно придется прописывать копирование каждой переменной или можно как-то их скопом скопировать? (а затем уже с нужными объектами провести глубокое копирование) |
|||
|
||||
xvr |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 40 Всего: 223 |
|
|||
|
||||
exploys |
|
|||
Новичок Профиль Группа: Участник Сообщений: 22 Регистрация: 23.4.2009 Репутация: нет Всего: нет |
Я тоже подумал, что это некий костыль. А адекватного способа так и не нашел. Т.е. либо полностью отдавать на откуп компилятору который почленно произведет поверхностное копирование. Либо делать глубокое, но уже самому почленно все прописывать. Оба варианта не всегда подходят. Как вариант использовать умные указатели и контейнеры. |
|||
|
||||
GremlinProg |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: 99 Всего: 106 |
адекватный - не переписывать оператор = в этом случае все данные копируются почленно автоматом Добавлено @ 11:45 если надо совместить почленное и глубокое копирование, то используется наследование:
в классе A не должен быть переписан оператор = Добавлено @ 11:50 кстати, тема подходит больше для раздела C/C++: Общие вопросы, перенести? хотя, ладно, раз Multithreading, пусть тут живет Это сообщение отредактировал(а) GremlinProg - 1.12.2010, 12:00 -------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
|||
|
||||
exploys |
|
|||
Новичок Профиль Группа: Участник Сообщений: 22 Регистрация: 23.4.2009 Репутация: нет Всего: нет |
Спасибо, то что нужно
![]() |
|||
|
||||
![]() ![]() ![]() |
Правила форума "C/C++: Системное программирование и WinAPI" | |
|
На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы . Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |