Проблема с оператором разыменования и функциями - PullRequest
3 голосов
/ 20 марта 2009

У меня есть функция A (), которая возвращает указатель на объект. В функции B () я пытаюсь изменить член этого объекта следующим образом:

void B()
{
    ObjType o = *getObj();
    o.set("abc");
}

Объект o хранится в массиве, и когда я печатаю значение члена, кажется, что ничего не произошло, и член все еще имеет старое значение;

Решение довольно простое:

void B()
{
    ObjType * o = getObj();
    o->set("abc");
}

Это работает. Но для меня это совершенно так же, как первый образец. Кто-нибудь может объяснить это?

Ответы [ 4 ]

9 голосов
/ 20 марта 2009

Следующая строка скорее всего копирует объект:

ObjType o = *getObj();

Вот почему ничего не происходит. Если вы не хотите использовать указатель, как показано во втором фрагменте, вы можете использовать следующую ссылку:

ObjType& o = *getObj();
o.set("abc");
4 голосов
/ 20 марта 2009

Первый создает копию объекта. Второй создает указатель на него. В первом случае вы модифицируете копию.

3 голосов
/ 20 марта 2009

Конечно, это не то же самое. Первый копирует объект, на который указывает возвращенный указатель, в локальный объект в вашем стеке, затем изменяет копию.

Второй сохраняет указатель на возвращаемый объект и изменяет его через указатель, тем самым изменяя оригинал.

Третьим решением будет использование ссылок.

2 голосов
/ 20 марта 2009

Два совершенно разные:

   ObjType o = *getObj();

создает новую копию объекта с именем o

   ObjType * o = getObj();

создает указатель с именем o, который указывает на существующую копию - новый объект не создается

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