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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> передача по ссылке + автоматический объект, l-value, передача по ссылке 
:(
    Опции темы
varnie
Дата 9.7.2008, 15:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

Репутация: нет
Всего: 0



день добрый всем!!

пускай, есть у наc:
Код

class Bar{
public:
    Bar(){}
};

class Foo{
    Bar _bar;
public:
    //...
    void setBar(const Bar &bar){
        _bar = bar;
    }
};

и где-то в коде:
Код

void f(){
    Foo instance;
    Bar b;
    instance.setBar(b);
}

но что если у нас нет необходимости создавать на стеке отдельно Bar b, а мы хотим передать в setBar сразу же автоматический созданный объект:
Код

void f(){
    Foo instance;
    instance.setBar(Bar()); 
}

ввиду передачи по ссылке в последнем куске кода это сделать не получится. ибо передаваемый Bar() не будет являться l-value, следовательно, и его ссылку взять нет возможности.
ясно, что можно переписать:
Код

    void Foo::setBar(const Bar bar){ //сделали передачу по значению
        _bar = bar;
    }

но что если мы принципиально хотим передавать bar по ссылке ?? (допустим, в целях оптимизации, имея ввиду что объект Bar больших размеров, следовательно, предпочтительнее передача по ссылке?
так как же найти компромисс/решение?
спасибо за пояснения.
PM MAIL   Вверх
Daevaorn
Дата 9.7.2008, 15:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

Репутация: нет
Всего: 70



Цитата(varnie @  9.7.2008,  16:17 Найти цитируемый пост)
ввиду передачи по ссылке в последнем куске кода это сделать не получится. ибо передаваемый Bar() не будет являться l-value, следовательно, и его ссылку взять нет возможности.

точно? по константной?
PM MAIL WWW   Вверх
varnie
Дата 9.7.2008, 15:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

Репутация: нет
Всего: 0



Цитата(Daevaorn @ 9.7.2008,  18:25)
Цитата(varnie @  9.7.2008,  16:17 Найти цитируемый пост)
ввиду передачи по ссылке в последнем куске кода это сделать не получится. ибо передаваемый Bar() не будет являться l-value, следовательно, и его ссылку взять нет возможности.

точно? по константной?

действительно, по константной ссылке передает!
т.е. пример выше корректен самый нижний.
хмм, тогда я что-то недопонимаю. а почему если мы сменим:
Код

Foo::setBar(const Bar &b);

на 
Код

Foo::setBar(Bar &b);

то при попытке
Код

Foo instance;
instance.setBar(Bar());

мы получим
Цитата

error: no matching function for call to 'Foo::setBar(Bar)'
note: candidates are: void Foo::setBar(Bar&)"

поясните плиз этот тонкий момент если не сложно.
PM MAIL   Вверх
Lazin
Дата 9.7.2008, 16:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 27
Всего: 154



потому-что сигнатуры ф-й отличаются
PM MAIL Skype GTalk   Вверх
nk19
Дата 9.7.2008, 16:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Я так думаю: когда const убираем из
Код

Foo::setBar(const Bar &b);

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

instance.setBar(Bar());

изменять не имеет смысла, компилятор и ругается
PM MAIL   Вверх
Любитель
Дата 9.7.2008, 17:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

Репутация: нет
Всего: 92



Если я не туплю - это вроде обещали исправить. Нет?


--------------------
PM MAIL ICQ Skype   Вверх
JackYF
Дата 9.7.2008, 17:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 6
Всего: 162



Цитата(Любитель @  9.7.2008,  16:05 Найти цитируемый пост)
Если я не туплю - это вроде обещали исправить. Нет?

Кто? где?


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
bsa
Дата 9.7.2008, 17:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Цитата(Любитель @ 9.7.2008,  17:05)
Если я не туплю - это вроде обещали исправить. Нет?

Зачем это исправлять?!?
PM   Вверх
Любитель
Дата 9.7.2008, 17:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

Репутация: нет
Всего: 92



Rvalue References - это не то? smile


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


Эксперт
***


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

Репутация: 7
Всего: 60



Цитата(varnie @  9.7.2008,  15:46 Найти цитируемый пост)
поясните плиз этот тонкий момент если не сложно.

а чего пояснять-то? по ссылке передаются только lvalue. Если не lvalue то только  const ссылка


Это сообщение отредактировал(а) Fazil6 - 10.7.2008, 00:01
PM MAIL   Вверх
bsa
Дата 10.7.2008, 08:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Цитата(Любитель @ 9.7.2008,  17:57)
Rvalue References - это не то? smile

Это то, вот только там синтаксис немного другой - два амперсанда, а не один.  smile  И это вещь, уверен, жутко полезная.
PM   Вверх
Любитель
Дата 10.7.2008, 11:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

Репутация: нет
Всего: 92



Цитата(bsa @  10.7.2008,  08:51 Найти цитируемый пост)
вот только там синтаксис немного другой - два амперсанда, а не один.

Эт я знаю. Хотя и плохо омню smile Ибо как ни странно - не юзал smile Лишь разок читал.


--------------------
PM MAIL ICQ Skype   Вверх
Annihilator
Дата 10.7.2008, 18:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


bytegrinder
**


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

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



 странно у меня никакой ошибки не выдает (VS2008) если убрать const

Это сообщение отредактировал(а) Annihilator - 10.7.2008, 19:01


--------------------
Если вы не можете сделать хоpошyю пpогpаммy, сделайте, чтобы она по кpайней меpе выглядела хоpошо
PM ICQ   Вверх
varnie
Дата 10.7.2008, 22:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

Репутация: нет
Всего: 0



я пробовал только на gcc 4.2.1 [FreeBSD]. ругалась.
PM MAIL   Вверх
Annihilator
Дата 11.7.2008, 20:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


bytegrinder
**


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

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



А вы бы не могли пояснить мне эту конструкцию - первый раз встречаю.
В функцию мы передаем аргумент, являющийся конструктором.
Код

instance.setBar(Bar());

 Конструктор ничего не возвращает - так везде пишут. Но в прототипе функции
Код

void setBar(const Bar &bar)

 можно увидеть, что она принимает константную ссылку!!! Как это понять?
 smile 

Это сообщение отредактировал(а) Annihilator - 11.7.2008, 20:11


--------------------
Если вы не можете сделать хоpошyю пpогpаммy, сделайте, чтобы она по кpайней меpе выглядела хоpошо
PM ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

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


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

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


 




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


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

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