Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> неинициализированная ссылка 
:(
    Опции темы
GoldFinch
Дата 14.7.2009, 22:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: 15
Всего: 26



как объявить переменную-ссылку, не инициализируя ее чем-то конкретным?
например для указателей можно написать T* p=0;
а для ссылок как?
PM MAIL ICQ   Вверх
ИванМ
Дата 14.7.2009, 22:35 (ссылка) |    (голосов:3) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1260
Регистрация: 19.6.2006
Где: СПб

Репутация: 1
Всего: 23



Одно из базовых отличий независимой ссылки от указателя тем, что она всегда должна инициализироваться. Независимая ссылка это просто второе имя переменной.
PM MAIL   Вверх
azesmcar
Дата 14.7.2009, 22:55 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



Вкратце - никак.
Ссылка всегда указывает на объект. В общем случае ссылки на null (т.е. ссылки которая не ссылается на валидный объект) не может быть, так как единственный путь получить ее - разыменовать нулевой указатель, а это undefined behavior.

А зачем это нужно?

Добавлено @ 22:58
Цитата(GoldFinch @  14.7.2009,  22:55 Найти цитируемый пост)
т.е. сначала объявление ссылки, потом ее инициализация.  

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

T* x;
...
x = &something
T& xref = *x; //если уж очень нужен reference


Это сообщение отредактировал(а) azesmcar - 14.7.2009, 23:02
PM   Вверх
GoldFinch
Дата 14.7.2009, 22:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: 15
Всего: 26



ИванМ, я рад что вы это знаете, я тоже это знаю, но мне бы проблему решить...

у меня должен быть примерно такой код
T& x;
...
x=...;

т.е. сначала объявление ссылки, потом ее инициализация. 
PM MAIL ICQ   Вверх
GoldFinch
Дата 14.7.2009, 23:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: 15
Всего: 26



ок, я хочу такой код:

Код

namespace loginserver {
    namespace packets {
        struct ServerList
        {
            struct Server ...
            { ... }

            std::vector<Server> servers;
            ...
        }
    
    }
}


foo()
{

    loginserver::packets::ServerList::Server& gs_info;
    BOOST_FOREACH( gs_info , serverList.servers )
    {
        if ( gs_info.gs_id==cfg.GameServerID )
            break;
    }
    ... gs_info ...

}


PM MAIL ICQ   Вверх
azesmcar
Дата 14.7.2009, 23:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



Так не пойдет?
Код

BOOST_FOREACH(loginserver::packets::ServerList::Server& gs_info, serverList.servers)
{
    /* ... */
}

PM   Вверх
GoldFinch
Дата 14.7.2009, 23:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: 15
Всего: 26



azesmcar, нет, потому что видимость переменной объявленной внутри for(;;)  ограничена только этим for(;;)

Добавлено через 3 минуты и 35 секунд
Цитата(azesmcar @  14.7.2009,  23:55 Найти цитируемый пост)
ссылка должна инициализироваться, после этого ее нельзя заставить ссылаться на другой объект.

Код

int x,y;
int& p=x;
p=y;

какбэ работает
PM MAIL ICQ   Вверх
ИванМ
Дата 14.7.2009, 23:12 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1260
Регистрация: 19.6.2006
Где: СПб

Репутация: 1
Всего: 23



Если так:
Код

foo()
{
    loginserver::packets::ServerList::Server *gs_info_ext;
    BOOST_FOREACH(loginserver::packets::ServerList::Server &gs_info , serverList.servers )
    {
        if ( gs_info.gs_id==cfg.GameServerID )
        {
            gs_info_ext=&gs_info;
            break;
        }
    }
    ... *gs_info_ext ...
}

PM MAIL   Вверх
azesmcar
Дата 14.7.2009, 23:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



Цитата(GoldFinch @  14.7.2009,  23:08 Найти цитируемый пост)
azesmcar, нет, потому что видимость переменной объявленной внутри for(;;)  ограничена только этим for(;;) 

Храни указатель, а для итерации оставь reference.
Код

loginserver::packets::ServerList::Server& gs_info_ptr = 0;
BOOST_FOREACH(loginserver::packets::ServerList::Server& gs_info, serverList.servers)
{
    /* ... */
   gs_info_ptr = &gs_info;
}
...
...gs_info_ptr...


Добавлено через 33 секунды
Цитата(ИванМ @  14.7.2009,  23:12 Найти цитируемый пост)
Если так:

опередил  smile 
PM   Вверх
GoldFinch
Дата 14.7.2009, 23:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: 15
Всего: 26



ИванМazesmcar
как раз так сейчас и написано smile
PM MAIL ICQ   Вверх
azesmcar
Дата 14.7.2009, 23:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



Цитата(GoldFinch @  14.7.2009,  23:20 Найти цитируемый пост)
ИванМ, azesmcar, 
как раз так сейчас и написано smile 

А в чем проблема? золотое правило программиста, работает? ради бога не трогай smile 
PM   Вверх
GoldFinch
Дата 14.7.2009, 23:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: 15
Всего: 26



azesmcar, так я хотел чтоб было красиво - неполучилось. написал временно некрасиво, запостил на форум, продолжил писать дальше
но хотелось бы всеже красиво)
PM MAIL ICQ   Вверх
azesmcar
Дата 14.7.2009, 23:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



GoldFinch

Попробуй организовать итерацию по указателю.
Код

loginserver::packets::ServerList::Server* gs_info_ptr;
BOOST_FOREACH(gs_info_ptr, serverList.servers)
{
    ...
}

что-то вроде этого. Но я не знаю что там в serverList.servers, можно ли изменить? А может вообще лучше будет убрать foreach и использовать iterator-ы?

Это сообщение отредактировал(а) azesmcar - 15.7.2009, 08:08
PM   Вверх
zim22
Дата 15.7.2009, 07:08 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 24
Всего: 69



Цитата(azesmcar @  14.7.2009,  22:55 Найти цитируемый пост)
 ссылка должна инициализироваться, после этого ее нельзя заставить ссылаться на другой объект

Цитата(GoldFinch @  14.7.2009,  23:08 Найти цитируемый пост)
какбэ работает

Код

int x = 5, y = 7; 
int& p=x; // связать на веки вечные p c x
p=y;       // x присвоить значение игрека
p = 99; // x присвоить 99

смотря что понимать под "работает". если компилируется - то да, "работает" smile
***
Цитата(azesmcar @  14.7.2009,  23:13 Найти цитируемый пост)
Храни указатель, а для итерации оставь reference.

Код

loginserver::packets::ServerList::Server& gs_info_ptr = 0;

azesmcar, , или я чего-то не понимаю, или... как вы ссылку с нулём связали? только константые ссылки такое умеют. опечатались наверно.

Это сообщение отредактировал(а) zim22 - 15.7.2009, 07:12


--------------------
PM MAIL   Вверх
azesmcar
Дата 15.7.2009, 08:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



Цитата(zim22 @  15.7.2009,  07:08 Найти цитируемый пост)
azesmcar, , или я чего-то не понимаю, или... как вы ссылку с нулём связали? только константые ссылки такое умеют. опечатались наверно.

там указатель должен быть, название на gs_info_ptr сменил, а & на * заменить забыл. Но мысль думаю понятна smile 
PM   Вверх
mes
Дата 15.7.2009, 08:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(GoldFinch @  14.7.2009,  22:01 Найти цитируемый пост)
ок, я хочу такой код:

интересно, а чем должна быть инициализированна ссылка, если не найден подходящий элемент ?
если известен ответ на этот вопрос, то вероятно поможет обертка типа FIND для BOOST_FOREACH.




--------------------
PM MAIL WWW   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0916 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.