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

#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. Я боялся, что классы должны помочь. Но спасибо за разъяснения и оптимизированный код.