Извините, ничего не найдено.

Не расстраивайся! Лучше выпей чайку!
Регистрация
Справка
Календарь

Вернуться   forum.boolean.name > Программирование игр для компьютеров > C++

Ответ
 
Опции темы
Старый 06.01.2013, 13:22   #1
wolfhound512
Знающий
 
Аватар для wolfhound512
 
Регистрация: 18.02.2008
Сообщений: 276
Написано 121 полезных сообщений
(для 299 пользователей)
Вызов конструктора в списке аргументов функции

Есть ли принципиальная разница между:
myClass tmp;
func( tmp );
и
func( myClass() );
?
Описание func()
void func(myClass& obj);
Второй вариант короче и удобнее, но не компилируется на GCC под Ubuntu, пишет что невозможно преобразовать myClass в myClass&
__________________
GUI, GUIw512, AlbaLynx, Форум
(Offline)
 
Ответить с цитированием
Старый 06.01.2013, 15:27   #2
jimon
 
Сообщений: n/a
Ответ: Вызов конструктора в списке аргументов функции

вариант с ошибкой :

class foo
{
public:
    int a;
    foo()
        :a(1)
    {
    }
};

void bar(foo & b)
{
}

int main()
{
    bar(foo());
    return 0;
}
prog.cpp: In function ‘int main()’:
prog.cpp:17: error: invalid initialization of non-const reference of type ‘foo&’ from a temporary of type ‘foo’
prog.cpp:11: error: in passing argument 1 of ‘void bar(foo&)’
собсно компилятор нам и говорит что такая запись не имеет смысла - если мы поменяем foo в функции то как нам вернуть результат ?

потому правильный вариант :

class foo
{
public:
    int a;
    foo()
        :a(1)
    {
    }
};
 
void bar(const foo & b)
{
}
 
int main()
{
    bar(foo());
    return 0;
}
и он компилируется без ошибки
 
Ответить с цитированием
Эти 2 пользователя(ей) сказали Спасибо за это полезное сообщение:
St_AnGer (07.01.2013), wolfhound512 (06.01.2013)
Старый 06.01.2013, 17:01   #3
wolfhound512
Знающий
 
Аватар для wolfhound512
 
Регистрация: 18.02.2008
Сообщений: 276
Написано 121 полезных сообщений
(для 299 пользователей)
Ответ: Вызов конструктора в списке аргументов функции

У меня GCC компилятор пишет именно о невозможности преобразования из myClass в myClass&, поэтому суть претензий не понятна была.
Но в студии такая функция работает нормально:
myClass& foo(myClass& obj) {
   \\изменение obj
   return obj;
}

foo( myClass() );
Для такого случая надо использовать исключительно первый вариант?
__________________
GUI, GUIw512, AlbaLynx, Форум
(Offline)
 
Ответить с цитированием
Старый 06.01.2013, 18:23   #4
jimon
 
Сообщений: n/a
Ответ: Вызов конструктора в списке аргументов функции

Сообщение от wolfhound512 Посмотреть сообщение
У меня GCC компилятор пишет именно о невозможности преобразования из myClass в myClass&, поэтому суть претензий не понятна была.
Но в студии такая функция работает нормально:
myClass& foo(myClass& obj) {
   \\изменение obj
   return obj;
}

foo( myClass() );
Для такого случая надо использовать исключительно первый вариант?
ну да, когда ты передаешь ссылку и создаешь класс inplace то получается временный объект, менять его смысла нету, он разрушится как только функция вернет результат, потому чтобы не плодить лишних багов такое поведение запретили в стандарте, а visual studio разрешает

можно конечно копнуть глубже, но нужно ли ? если уж сильно хочется то вот статья которая объясняет такое поведение http://blogs.msdn.com/b/vcblog/archi...10-part-2.aspx
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
wolfhound512 (06.01.2013)
Старый 06.01.2013, 21:29   #5
wolfhound512
Знающий
 
Аватар для wolfhound512
 
Регистрация: 18.02.2008
Сообщений: 276
Написано 121 полезных сообщений
(для 299 пользователей)
Ответ: Вызов конструктора в списке аргументов функции

Спасибо, полезная статья
__________________
GUI, GUIw512, AlbaLynx, Форум
(Offline)
 
Ответить с цитированием
Ответ


Опции темы

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


Часовой пояс GMT +4, время: 14:56.


vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot
Style crйe par Allan - vBulletin-Ressources.com