Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Копирование структур  (Прочитано 6739 раз)
0 Пользователей и 1 Гость смотрят эту тему.
AlexCasual
Помогающий

by
Offline Offline

« : 24-07-2012 18:28 » 

Имеется следующая структура :
Код:
typedef struct _PARAM
{
std::list<UCHAR>    charList;
std::map<std::wstring,size_t> stringMap;

}PARAM,*PPARAM;

И вот такой код :

Код:
PARAM Parameters;

GetParameters(&Parameters);

//1
......

void GetParameters(PPARAM Parameters)
{
    PARAM initParameters;
   
    initParameters.charList.push_back(0xA);
    initParameters.stringMap.insert(std::make_pair(10,L"test");

   *Parameters = initParameters;
}

Будут ли правильно скопированы все поля initParameters в Parameters после вызова GetParameters, вызовутся ли конструкторы копирования для std::list и std::map?
Как вообще лучше поступать при копировании сложных структур?
Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #1 : 24-07-2012 19:30 » 

Нужно написать конструктор копирования для структуры. В твоем примере конструкторы копирования членов структуры (если они есть) использованы не будут.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Вад
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #2 : 24-07-2012 20:49 » new

Нужно написать конструктор копирования для структуры. В твоем примере конструкторы копирования членов структуры (если они есть) использованы не будут.
Это почему? Копирующий конструктор по умолчанию скопирует все члены копирующими конструкторами. Здесь же "стековые" члены, плоское копирование их включает. Были бы указатели - были бы проблемы, а так - не должно быть.
Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #3 : 25-07-2012 04:02 » 

Извиняюсь, что-то накатило. Давно не практиковался в C++.

Код: (C++)
#include <stdio.h>
#include <assert.h>
#include <map>

class myclass
{
public:
    int x;

    ~myclass()
    {
        printf("0x%08x: destructor\n", (unsigned int)(void*)this);
    }

    myclass(int x = 0) : x(x)
    {
        printf("0x%08x: constructor\n", (unsigned int)(void*)this);
    }

    myclass(const myclass &s) : x(s.x)
    {
        printf("0x%08x: copy by ref\n", (unsigned int)(void*)this);
    }

    myclass& operator=(const myclass &s)
    {
        assert(&s != this);

        x = s.x;
        printf("0x%08x: assign by ref\n", (unsigned int)(void*)this);
        return *this;
    }
};

class mystruct
{
public:
    std::map <int, myclass> map;
};

int main()
{
    mystruct b;
    mystruct a;
    myclass x(10);

    printf("-- set:\n");
    b.map[1] = x;
    printf("-- copy:\n");
    a = b;
    printf("-- out:\n");

    return 0;
}

0xbffe4a18: constructor
-- set:
0xbffe49e0: constructor
0xbffe49dc: copy by ref
0x08f4e01c: copy by ref
0xbffe49dc: destructor
0xbffe49e0: destructor
0x08f4e01c: assign by ref
-- copy:
0x08f4e03c: copy by ref
-- out:
0xbffe4a18: destructor
0x08f4e03c: destructor
0x08f4e01c: destructor
« Последнее редактирование: 25-07-2012 04:04 от RXL » Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines