Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Есть ли способ переопределить ссылку после инициализации?

2.9K
18 февраля 2005 года
pushkin
43 / / 13.09.2004
Есть ли способ переопределить ссылку после инициализации?
У меня стоит задача переделать исходники с наименьшим кровопролитием. И было бы просто идеально, если бы я нашел способ это сделать. Дело в том, что в них используется
переопределение ссылки типа того:
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);

Если кто-нибудь с этим сталкивался, помогите пожалуйста :)
259
18 февраля 2005 года
AlexandrVSmirno
1.4K / / 03.12.2004
Цитата:
Originally posted by pushkin
Есть ли способ переопределить ссылку после инициализации?
У меня стоит задача переделать исходники с наименьшим кровопролитием. И было бы просто идеально, если бы я нашел способ это сделать. Дело в том, что в них используется
переопределение ссылки типа того:


Код:
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);
2.9K
18 февраля 2005 года
pushkin
43 / / 13.09.2004
Тогда получится ссылка на указатель, с которой я буду работать как с обычным указателем (придется его постоянно разыменовывать и т. д.), короче, надо будет переписать миллионы строк программ (во многих случаях компилятор даже ругаться не будет). Если уже и работать с указателями, то никаких ссылок и не понадобится. Но мне нужно, чтоб весь написанный до меня код перекомпилировался с незначительными изменениями в ограниченных местах.
Вот как происходит использование этих ссылок: есть один базовый класс, у которого есть буфер для сообщения об ошибке и ссылка на этот буфер. Есть много других классов, которые наследуются от данного (около 1000). И есть класс, который может содержать переменные любого класса из этого множества, у него тоже есть буфер для сообщения об ошибке. В конструкторах этих "маленьких" классов происходит инициализация ссылок на буфер для сообщения об ошибке. После этой инициализации ссылки переопределяются так, чтоб они ссылались на буфер большого класса.
Можно, конечно, все переписать так, чтоб для этого использовались указатели, но тогда мне придется этим заниматься недели 2 и не факт, что все сразу будет правильно работать
259
18 февраля 2005 года
AlexandrVSmirno
1.4K / / 03.12.2004
Цитата:
Originally posted by pushkin
Тогда получится ссылка на указатель, с которой я буду работать как с обычным указателем (придется его постоянно разыменовывать и т. д.), короче, надо будет переписать миллионы строк программ (во многих случаях компилятор даже ругаться не будет). Если уже и работать с указателями, то никаких ссылок и не понадобится. Но мне нужно, чтоб весь написанный до меня код перекомпилировался с незначительными изменениями в ограниченных местах.
Вот как происходит использование этих ссылок: есть один базовый класс, у которого есть буфер для сообщения об ошибке и ссылка на этот буфер. Есть много других классов, которые наследуются от данного (около 1000). И есть класс, который может содержать переменные любого класса из этого множества, у него тоже есть буфер для сообщения об ошибке. В конструкторах этих "маленьких" классов происходит инициализация ссылок на буфер для сообщения об ошибке. После этой инициализации ссылки переопределяются так, чтоб они ссылались на буфер большого класса.
Можно, конечно, все переписать так, чтоб для этого использовались указатели, но тогда мне придется этим заниматься недели 2 и не факт, что все сразу будет правильно работать


Да нет.

 
Код:
int &ref; //ссылка на int (содержит адрес int)
int* ptr; //указатель на int (содержит адрес int)
ref = ptr; //обмен содержимым между ref и ptr. Т.е. адресами
368
18 февраля 2005 года
rostyslav
629 / / 13.07.2004
Так как ты хотел, чтоб оно работало, нужно писать
Код:
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));
Чтоб с минимальными затратами, нужно вместо ссылки использовать указатель.

1. Сперва заменить все int &, на int *. Это можно сделать с Relpace All. После этого, на всякий случай можно проверить, осталось ли символа & в исходном коде. Он мог бы остаться только в определениях ф-ий, там тоже нужно поменять на *.

2. Откомпилировать проект. Компилятор выдаст ошибку 2х типов. Неправильная инициализация, и неправильное использование ".". Точку, тоже можно заменить с Replace All, на ->. Конечно не в автоматическом режиме. Останется исправить инициализацию. Это работа макс. на пару часов, но не на 2 недели.
2.9K
18 февраля 2005 года
pushkin
43 / / 13.09.2004
Как раз вот этим я сейчас и занимаюсь. У меня не один проект, а целая куча - это автоматизированная банковская система, написанная 10 лет назад под ДОС :-) Ладно, всеравно спасибо за помощь. Это, кажется, называется "тактика мозгового штурма".
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог