Как безопасно скопировать глобальный объект в указатель - PullRequest
0 голосов
/ 04 мая 2020

У меня есть класс заголовка, который содержит объявление встроенной переменной, которую я использую в качестве глобальной переменной. Я хочу делать копию этой переменной каждый раз, когда вызываю функцию.

globalitems.h

#ifndef GLOBALVAR_H
#define GLOBALVAR_H

struct Data {
    int a; 
    Data(int ca) {
       a = ca;
    }
};

inline Data globaldata(3);

#endif

Otherclass.h

#include "globalitems.h"

void createPointerCopy() {
    Data* tempPointer = &globaldata;
    tempPointer->a = 30;
    std::cout << tempPointer->a << std::endl;
    std::cout << globaldata.a << std::endl;
}

int main() {
    createPointerCopy();
    return 0;
}

вывод

30

30

В то время как мой желаемый результат равен

30

3

Как сделать так, чтобы createCopy() безопасно создавал копию объекта globaldata?

Ответы [ 2 ]

1 голос
/ 04 мая 2020

Если я вас хорошо понимаю, вам нужно не получить указатель на ваш глобальный объект, но вы хотите создать копию, а именно:

void createPointerCopy() {
    Data temp = globaldata;
    temp.a = 30;
    std::cout << temp.a << std::endl;
    std::cout << globaldata.a << std::endl;
}
0 голосов
/ 04 мая 2020

Итак, я думаю, что ваша проблема в том, что обе переменные указывают на одно и то же место в памяти. Что вы действительно говорите компилятору:

  Data* tempPointer = &globaldata;

- это взять адрес globaldata и присвоить его tempPointer. Таким образом, изменяя поля tempPointer, вы меняете поля globaldata. Или, другими словами, (* tempPointer) становится псевдонимом для глобальных данных. Я вижу два варианта:

 Data tempData = globaldata;

и предоставляем конструктор копирования при необходимости; Или просто:

 int tempVal = globaldata.a

Кроме того, я думаю, вы, возможно, захотите познакомиться с Singleton pattern

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...