int i = 10; // Определяем переменную типа int
int i2 = 20; // Еще одну
int &iRef = i; // Определяем ссылку на i
&iRef = i2; // После этого iRef ссылается на i2
На такое работает только в старом Borland C++ 3.x, а мне надо заставить это работать в Borland C++ Builder 6.x
Была у меня идея написать так:
int i = 10;
int i2 = 20;
// Определяем указатель на первую переменную
int *iPtr = &i;
// Определяем ссылку на разыменованный указатель
int &iRefPtr = *iPtr; [COLOR=red]//здесь не стыковка
//*iPtr - это содержимое по ссылке (т.е. i), а не адрес значения.
//нужно int &RefPtr = iPtr;[/COLOR]
// Потом изменяем указатель чтоб он указывал на i2
iPtr = &i2;
// После такого, я думал, будет выведено значение
// переменной i2, но на самом деле так не вышло :(
printf("%i\n",iRefPtr);
Есть ли способ переопределить ссылку после инициализации?
У меня стоит задача переделать исходники с наименьшим кровопролитием. И было бы просто идеально, если бы я нашел способ это сделать. Дело в том, что в них используется
переопределение ссылки типа того:
int i = 10; // Определяем переменную типа int
int i2 = 20; // Еще одну
int &iRef = i; // Определяем ссылку на i
&iRef = i2; // После этого iRef ссылается на i2
На такое работает только в старом Borland C++ 3.x, а мне надо заставить это работать в Borland C++ Builder 6.x
Была у меня идея написать так:
int i = 10;
int i2 = 20;
// Определяем указатель на первую переменную
int *iPtr = &i;
// Определяем ссылку на разыменованный указатель
int &iRefPtr = *iPtr;
// Потом изменяем указатель чтоб он указывал на i2
iPtr = &i2;
// После такого, я думал, будет выведено значение
// переменной i2, но на самом деле так не вышло :(
printf("%i\n",iRefPtr);
Если кто-нибудь с этим сталкивался, помогите пожалуйста :)
Цитата:
Originally posted by pushkin
Есть ли способ переопределить ссылку после инициализации?
У меня стоит задача переделать исходники с наименьшим кровопролитием. И было бы просто идеально, если бы я нашел способ это сделать. Дело в том, что в них используется
переопределение ссылки типа того:
Есть ли способ переопределить ссылку после инициализации?
У меня стоит задача переделать исходники с наименьшим кровопролитием. И было бы просто идеально, если бы я нашел способ это сделать. Дело в том, что в них используется
переопределение ссылки типа того:
Код:
Вот как происходит использование этих ссылок: есть один базовый класс, у которого есть буфер для сообщения об ошибке и ссылка на этот буфер. Есть много других классов, которые наследуются от данного (около 1000). И есть класс, который может содержать переменные любого класса из этого множества, у него тоже есть буфер для сообщения об ошибке. В конструкторах этих "маленьких" классов происходит инициализация ссылок на буфер для сообщения об ошибке. После этой инициализации ссылки переопределяются так, чтоб они ссылались на буфер большого класса.
Можно, конечно, все переписать так, чтоб для этого использовались указатели, но тогда мне придется этим заниматься недели 2 и не факт, что все сразу будет правильно работать
Цитата:
Originally posted by pushkin
Тогда получится ссылка на указатель, с которой я буду работать как с обычным указателем (придется его постоянно разыменовывать и т. д.), короче, надо будет переписать миллионы строк программ (во многих случаях компилятор даже ругаться не будет). Если уже и работать с указателями, то никаких ссылок и не понадобится. Но мне нужно, чтоб весь написанный до меня код перекомпилировался с незначительными изменениями в ограниченных местах.
Вот как происходит использование этих ссылок: есть один базовый класс, у которого есть буфер для сообщения об ошибке и ссылка на этот буфер. Есть много других классов, которые наследуются от данного (около 1000). И есть класс, который может содержать переменные любого класса из этого множества, у него тоже есть буфер для сообщения об ошибке. В конструкторах этих "маленьких" классов происходит инициализация ссылок на буфер для сообщения об ошибке. После этой инициализации ссылки переопределяются так, чтоб они ссылались на буфер большого класса.
Можно, конечно, все переписать так, чтоб для этого использовались указатели, но тогда мне придется этим заниматься недели 2 и не факт, что все сразу будет правильно работать
Тогда получится ссылка на указатель, с которой я буду работать как с обычным указателем (придется его постоянно разыменовывать и т. д.), короче, надо будет переписать миллионы строк программ (во многих случаях компилятор даже ругаться не будет). Если уже и работать с указателями, то никаких ссылок и не понадобится. Но мне нужно, чтоб весь написанный до меня код перекомпилировался с незначительными изменениями в ограниченных местах.
Вот как происходит использование этих ссылок: есть один базовый класс, у которого есть буфер для сообщения об ошибке и ссылка на этот буфер. Есть много других классов, которые наследуются от данного (около 1000). И есть класс, который может содержать переменные любого класса из этого множества, у него тоже есть буфер для сообщения об ошибке. В конструкторах этих "маленьких" классов происходит инициализация ссылок на буфер для сообщения об ошибке. После этой инициализации ссылки переопределяются так, чтоб они ссылались на буфер большого класса.
Можно, конечно, все переписать так, чтоб для этого использовались указатели, но тогда мне придется этим заниматься недели 2 и не факт, что все сразу будет правильно работать
Да нет.
Код:
int &ref; //ссылка на int (содержит адрес int)
int* ptr; //указатель на int (содержит адрес int)
ref = ptr; //обмен содержимым между ref и ptr. Т.е. адресами
int* ptr; //указатель на int (содержит адрес int)
ref = ptr; //обмен содержимым между ref и ptr. Т.е. адресами
Код:
int i = 10;
int i2 = 20;
// Определяем указатель на первую переменную
int *iPtr = &i;
// Определяем ссылку на разыменованный указатель
int &iRefPtr = [COLOR=red](int)[/COLOR]iPtr;
ShowMessage(IntToStr([COLOR=red]*(int *))[/COLOR]iRefPtr);
// Потом изменяем указатель чтоб он указывал на i2
iPtr = &i2;
ShowMessage(IntToStr([COLOR=red]*(int *)[/COLOR]iRefPtr));
int i2 = 20;
// Определяем указатель на первую переменную
int *iPtr = &i;
// Определяем ссылку на разыменованный указатель
int &iRefPtr = [COLOR=red](int)[/COLOR]iPtr;
ShowMessage(IntToStr([COLOR=red]*(int *))[/COLOR]iRefPtr);
// Потом изменяем указатель чтоб он указывал на i2
iPtr = &i2;
ShowMessage(IntToStr([COLOR=red]*(int *)[/COLOR]iRefPtr));
1. Сперва заменить все int &, на int *. Это можно сделать с Relpace All. После этого, на всякий случай можно проверить, осталось ли символа & в исходном коде. Он мог бы остаться только в определениях ф-ий, там тоже нужно поменять на *.
2. Откомпилировать проект. Компилятор выдаст ошибку 2х типов. Неправильная инициализация, и неправильное использование ".". Точку, тоже можно заменить с Replace All, на ->. Конечно не в автоматическом режиме. Останется исправить инициализацию. Это работа макс. на пару часов, но не на 2 недели.
Как раз вот этим я сейчас и занимаюсь. У меня не один проект, а целая куча - это автоматизированная банковская система, написанная 10 лет назад под ДОС :-) Ладно, всеравно спасибо за помощь. Это, кажется, называется "тактика мозгового штурма".