Почему изменение ссылки на указатель не меняет его первоначальное значение? - PullRequest
3 голосов
/ 24 июня 2019

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

#include "stdio.h"
struct bar {};
class foo {
  public:
    foo(){
      barPtr = new bar();
    };
    bar* barPtr;

    bar*& getBarPtr() {
      return barPtr;
    };

};

int main() {
  foo fObject;
  bar* b = nullptr;

  b = fObject.getBarPtr();
  printf("B before updates %p\n", b);
  printf("barPtr before b updates %p\n", fObject.barPtr);

  b = new bar();
  printf("B after updates %p\n", b);
  printf("barPtr after b updates %p\n", fObject.barPtr);
  return 0;
}

Выходные данные

b before updates 0x55db559ace70
barPtr before b updates 0x55db559ace70
b after updates 0x55db559ad2a0
barPtr after b updates 0x55db559ace70

Что я хочу достичь, это изменить то, на что указывает barPtr с помощью b, поэтому я делаю getBarPtr функция возвращает ссылку barPtr.Я не понимаю, почему изменение b не меняет barPtr.

Ответы [ 3 ]

4 голосов
/ 24 июня 2019

Измените ваше определение b на:

bar*& b = fObject.getBarPtr();

В настоящее время вы копируете указатель fObject в b: это два независимых объекта.Они имеют то же значение (адрес, который указывает на объект bar, созданный вами в конструкторе foo), но они не связаны друг с другом.Поэтому, если вы назначите новое значение для b, вы перезапишите его без изменения fObject barPtr.

0 голосов
/ 24 июня 2019

Почему, по вашему мнению, изменяя указатель-переменную b, экземпляр класса будет изменен? Вы не измените это таким образом.

Вы выделили две разные переменные-указателя, одну в классе foo и одну вне: b;

Вы можете использовать указатель на указатель. И верните ссылку на указатель класса, а затем измените содержимое этой ссылки.

0 голосов
/ 24 июня 2019

b и barPtr - два указателя на один и тот же объект в памяти.Как только вы присваиваете новое значение b, это просто означает, что оно будет указывать на другой объект - как вы видели, оно не предоставит barPtr.

Если бы вы изменили сам объект(например, делая что-то вроде barPtr->modifyMyData()), вы бы увидели измененное значение из обоих указателей.

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