#arrays #global-variables #d #ref
#массивы #глобальные переменные #d #ссылка
Вопрос:
Я пытаюсь добавить новую структуру в глобальный ассоциативный массив из функции. Когда я создаю новую структуру непосредственно в массиве, а затем манипулирую ею с помощью указателя, все в порядке:
myObject[string] globalArray;
myObject * addMyObject(string d) {
myObject * p;
globalArray[d] = *(new myObject);
p = amp;(globalArray[d]);
[do changes to myObject by p]
return p;
}
Но если я сначала создаю локальный объект, а затем присваиваю его указатель элементу глобального массива, он ведет себя неправильно. Я вижу, что для массива создается копия объекта. Любые изменения в локальном объекте теряются, и в следующий раз, когда я обращаюсь к этому элементу из глобального массива, он в основном пустой (неизмененная новая структура).
myObject * addMyObject(string d) {
myObject * p;
p = new myObject;
globalArray[d] = *p;
[do changes to myObject by p]
return p;
}
Я все же хотел бы сначала использовать второй способ создания локального объекта. Но что я должен изменить в коде, чтобы созданный объект больше не был локальным, а действительно был элементом глобального массива?
Спасибо!
Ответ №1:
Структуры копируются по значению, обойти это невозможно. Вы можете либо переключиться на классы, либо на указатели в массиве, что решит вашу проблему.
Если вы действительно хотите сохранить данные структуры непосредственно в ассоциативном массиве, вам нужно будет сначала вставить объект в массив, а затем взять его указатель, после чего вы сможете его изменить.
myObject* addMyObject(string d) {
globalArray[d] = myObject();
auto p = amp;globalArray[d];
[do changes to myObject by p]
return p;
}
Комментарии:
1. Я боялся, что классы должны помочь. Но спасибо за разъяснения и оптимизированный код.