std :: map - вставка тела, которое является вложенной структурой - PullRequest
0 голосов
/ 22 апреля 2011

Работает ли следующее insert? Причина моего вопроса в том, что в теле есть другая структура, в которой есть еще одна структура (массив). Все переменные a, b, c, x, y и z являются вторичными и находятся только для поддержки моего вопроса.

Заранее спасибо.

struct S_A
{
    int a;
    float b;
    char c;
    // ...
    S_B my_double_nested_structure;
};

struct S_B
{
    int x;
    float y;
    char z;
    // .. .
    char array1[2];
};

typedef std::map<int, S_A> myAMapType;

S_A nestedStruct;
nestedStruct.a = 5;
nestedStruct.b = 5.9;
nestedStruct.c = 'A';
nestedStruct.my_double_nested_structure.x = 4;
nestedStruct.my_double_nested_structure.y = 8.9;
nestedStruct.my_double_nested_structure.z = 'B';
nestedStruct.my_double_nested_structure.array1[0] = 'B';
nestedStruct.my_double_nested_structure.array1[1] = 'C';

main()
{
    myAMapType finalMap;
    finalMap.insert(std::pair<int, S_A>(3, nestedStruct);
}

Ответы [ 4 ]

2 голосов
/ 23 апреля 2011

Ваш код будет компилироваться и работать, если вы определите struct S_B до struct S_A, потому что вы помещаете объект-член типа S_B в определение S_A, что подразумевает, что полный тип S_B должен быть определен в этой точке (если это будет просто указательк объекту тогда неполного типа будет достаточно).

И вы должны поместить присваивания

nestedStruct.a = 5;
nestedStruct.b = 5.9;
nestedStruct.c = 'A';
nestedStruct.my_double_nested_structure.x =4;
nestedStruct.my_double_nested_structure.y =8.9;
nestedStruct.my_double_nested_structure.z ='B';
nestedStruct.my_double_nested_structure.array1[0] ='B';
nestedStruct.my_double_nested_structure.array1[1] ='C';

в какую-то функцию.В глобальной области разрешены только объявления / определения (не выражения выражения и т. Д.).

В глобальной области вы можете использовать список инициализации для своей структуры:

S_A nestedStruct = { 5, 5.9, 'A', { 4, 8.9, 'B', { 'B', 'C' } } };

Списки инициализации разрешены для классовбез явных конструкторов (например, ваших структур) и для массивов таких классов или массивов простых типов.

1 голос
/ 22 апреля 2011

Да.Пока нет указателей, все это скомпилировано в один монолитный объект, который можно скопировать вокруг (например, в контейнеры).

Также ваш код не будет компилироваться из-за прямой ссылки на S_B, пропущенных скобоки т.д.

0 голосов
/ 22 апреля 2011

Как уже отмечали другие, код должен работать, за исключением опечаток. Обычно я бы использовал оператор [] для вставки в карту, например, например. finalMap[3]=nestedStruct.

0 голосов
/ 22 апреля 2011

Этот подход работает (кроме опечаток и тому подобного в коде). Вот почему:

Карта копирует-конструирует объект, который копируется, в вашем случае S_A, в его внутренние данные. Также S_A имеет конструктор копирования по умолчанию (автоматически сгенерированный), который копирует все свои поля один за другим и вызывает конструктор копирования S_B для копирования поля my_double_nested_structure. Он также имеет конструктор копирования по умолчанию, который - по порядку - копирует все свои поля.

Следовательно, во время вставки все данные правильно копируются в карту.

Пожалуйста, помните, что если бы у этих структур были какие-либо указатели, тогда были бы скопированы сами указатели, а не объекты, на которые они указывают.

...