Есть ли способ изменить внешний объект изнутри функции - PullRequest
0 голосов
/ 08 августа 2011

Можно ли определить функцию, которая заставит аргумент ссылаться на другой (уже существующий) объект после его возврата без использования указателей и т. Д.? Опять же, это не может просто изменить существующий объект с помощью конструктора копирования или оператора присваивания или чего-либо еще. Внешний объект будет ссылаться на другой блок памяти при возврате функции.

Например:

int x;
void change(int& blah) {
    blah = x; // I don't want to change blah's value to x's value, I want to make blah refer to x outside the function
}

void main() {
    int something = 0;
    change(something);
    assert(&x == &something);
}

Независимо от используемого метода, функция должна вызываться как

change(x);

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

Ответы [ 3 ]

5 голосов
/ 08 августа 2011

Нет, потому что something и x - это разные объекты.Они не относятся к разным объектам.Они не указывают на разные объекты.Они являются различными объектами.

Чтобы изменить, куда-то указывает, что-то должно быть указателем.Если у вас есть указатель, вы можете сделать это:

int x;

void change(int*& p)
{
    p = &x;
}

int main()
{
    int something = 0;
    int* pointer = &something; // pointer points to 'something'
    change(pointer);           // now pointer points to 'x'
    assert(&x == pointer);
}
1 голос
/ 08 августа 2011

Нет точно не возможно.И обычные переменные, такие как int x, и ссылочные переменные, такие как int &y(...), и массивы не подлежат повторной настройке, т. Е. Они всегда будут использовать / указывать на один и тот же кусок памяти.

Для получения функциональностивам требуется, вам действительно нужно либо использовать указатель, либо абстракцию указателей.В противном случае это невозможно.

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

Когда вы объявляете переменную наподобиеint x, вы действительно просите компилятор связать x с определенной областью памяти.Так, например, предположим, что x связан с четырехбайтовым кодом, начинающимся с 0x439FC2.Поскольку компилятор знает, что x всегда должен ссылаться на 0x439FC2, то любое использование x действительно может быть заменено поиском этих ячеек памяти и загрузкой их в регистры, помещением их в стек или чем-либо еще.В любом случае, конечный результат заключается в том, что имя переменной x в значительной степени заменяется числом 0x439FC2.Поэтому причина, по которой вы не можете перемещать x, заключается в том, что вы не можете сделать так, чтобы этот адрес памяти ссылался на другое место в памяти.

Опять же, это объяснение упрощено и не совсем верно, но это«интуитивный» способ рассуждения об автоматически назначаемых переменных.

0 голосов
/ 08 августа 2011

Вы хотите использовать ссылку на указатель:

void change(int &* blah, int * x){

  blah = x;
}

int * num1;
int num2 = 2;

change( num1, &num2 ); //num1 now points to num2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...