Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 17, средняя оценка - 4.88
Dgiu66
0 / 0 / 0
Регистрация: 12.06.2013
Сообщений: 11
#1

Ленивая инициализация! - C++

12.06.2013, 22:40. Просмотров 2428. Ответов 34
Метки нет (Все метки)

Объясните пожалуйста реальный пример применения ленивой инициализации.Можно с листингом простой программы.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.06.2013, 22:40
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Ленивая инициализация! (C++):

Инициализация - C++
1. Создать класс Solid 2. Его наследует Planet 3. В функции Gravitation используются объекты Solid Это все .h и .cpp библиотеки 4....

Инициализация ссылок - C++
Пусть T - это некоторый класс. Хотелось бы знать, всегда ли такой код приемлем. extern int function1(T); extern int function2(T&);...

Инициализация дерева - C++
Добрый день. пытаюсь писать небольшое бинарное дерево. вот что получилось #include <stdio.h> #include <stdlib.h> #include...

инициализация значений - C++
Всем привет! #include<iostream.h> #include<conio.h> #include<windows.h> #include<math.h> #include<string> class Money { ...

С++ сложная инициализация - C++
как в С++ инициализировать переменную с выбором значений, помню что то типоint c=3||4||5; либо синтаксис забил либо мне приснился такой...

Инициализация вектора - C++
у меня в классе есть vector из string (константный, просто строки нужны как образец для других функций), в конструкторе соответственно надо...

34
Dgiu66
0 / 0 / 0
Регистрация: 12.06.2013
Сообщений: 11
14.06.2013, 02:20  [ТС] #16
в какой момент выполняется без ленивой инициализании, а в какой с ленивой?
0
MrGluck
Модератор
Эксперт CЭксперт С++
7492 / 4607 / 693
Регистрация: 29.11.2010
Сообщений: 12,606
14.06.2013, 02:23 #17
Dgiu66, написано же. "Без" при конструировании объекта - "с" лишь при обращении к нужному методы
0
Dgiu66
0 / 0 / 0
Регистрация: 12.06.2013
Сообщений: 11
14.06.2013, 02:42  [ТС] #18
а по подробней?
0
MrGluck
Модератор
Эксперт CЭксперт С++
7492 / 4607 / 693
Регистрация: 29.11.2010
Сообщений: 12,606
14.06.2013, 03:20 #19
Цитата Сообщение от Dgiu66 Посмотреть сообщение
а по подробней?
а поподробней пишется слитно
Что может быть тривиальней примера Ленивая инициализация!
0
ForEveR
В астрале
Эксперт С++
7983 / 4742 / 321
Регистрация: 24.06.2010
Сообщений: 10,545
Завершенные тесты: 3
14.06.2013, 09:31 #20
У нас в частности, lazy инициализация используется для чтения из базы исключительно когда это нужно. Схематичный пример
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <boost/shared_ptr.hpp>
 
class ccard_impl;
typedef boost::shared_ptr<ccard_impl> ccard;
 
class Payment
{
public:
   ccard get_card() const
   {
      if (!card)
      {
         // load card from db
      }
      return card;
   }
private:
   mutable ccard card;
};
0
Dgiu66
0 / 0 / 0
Регистрация: 12.06.2013
Сообщений: 11
14.06.2013, 11:12  [ТС] #21
а можно подробно объяснить этот код?
0
ForEveR
В астрале
Эксперт С++
7983 / 4742 / 321
Регистрация: 24.06.2010
Сообщений: 10,545
Завершенные тесты: 3
14.06.2013, 11:14 #22
Dgiu66, Есть платеж. При создании платежа карта в классе не инициализирована. Достается карта из базы ТОЛЬКО по требованию (при первом вызове get_card()).
0
Dgiu66
0 / 0 / 0
Регистрация: 12.06.2013
Сообщений: 11
14.06.2013, 11:44  [ТС] #23
а в программе без ленивой инициализации как происходят действия? допустим нам нужна что-то посчитать из математики, как происходит без ленивой инициализации, а как с инициализацией?
0
ForEveR
В астрале
Эксперт С++
7983 / 4742 / 321
Регистрация: 24.06.2010
Сообщений: 10,545
Завершенные тесты: 3
14.06.2013, 12:00 #24
Dgiu66, А мозг включить хоть чуть-чуть? Хороший пример отложенных вычислений показывает std::future.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
#include <thread>
#include <future>
 
int calculate()
{
   std::cout << "Time to sleep" << std::endl;
   std::this_thread::sleep_for(std::chrono::seconds(1));
   std::cout << "Wakeup" << std::endl;
   return 42;
}
 
int main()
{
   std::future<int> future = std::async(calculate);
   std::cout << "Future created, but not called" << std::endl;
   std::cout << "Call get on future" << std::endl;
   std::cout << "Result is: " << future.get() << std::endl;
}
До тех пор пока не вызовем future.get() функция вызвана не будет.
0
Dgiu66
0 / 0 / 0
Регистрация: 12.06.2013
Сообщений: 11
14.06.2013, 12:07  [ТС] #25
а расписать можно подробно
0
Kuzia domovenok
1960 / 1813 / 143
Регистрация: 25.03.2012
Сообщений: 6,288
Записей в блоге: 1
14.06.2013, 12:16 #26
Цитата Сообщение от Dgiu66 Посмотреть сообщение
а расписать можно подробно
забей на это. Изучай программирование сам последовательно от простого к сложному. Если тебе эта инициализация не нужна пока, можешь не грузиться ей. Просто изучай язык! А то у меня подозрение, что ты С++ на прошлой неделе учить стал, основы не до конца изучил, а отвлекаешься уже на посторонние вопросы.
0
Dgiu66
0 / 0 / 0
Регистрация: 12.06.2013
Сообщений: 11
14.06.2013, 12:19  [ТС] #27
не в этом дело, мне на зачёт нужно ответить эту тему сегодня, препод сказал привести реальный пример с ленивой инициализацией.
0
Kuzia domovenok
1960 / 1813 / 143
Регистрация: 25.03.2012
Сообщений: 6,288
Записей в блоге: 1
14.06.2013, 12:23 #28
Цитата Сообщение от Dgiu66 Посмотреть сообщение
не в этом дело, мне на зачёт нужно ответить эту тему сегодня, препод сказал привести реальный пример с ленивой инициализацией.
Да брось ты эту учёбу. Бессмысленно тратить время на то, что не нравится.
1
ForEveR
В астрале
Эксперт С++
7983 / 4742 / 321
Регистрация: 24.06.2010
Сообщений: 10,545
Завершенные тесты: 3
14.06.2013, 12:25 #29
Dgiu66, ЧТО подробно расписывать? Ленивые вычисления подразумевают, что вычисление производится ТОЛЬКО тогда, когда нужен непосредственно результат. Все примеры здесь приведенные так или иначе относились к ленивости, идиома CoW - тоже является проявлением ленивости, полное копирование объекта идет исключительно при надобности.

На тему примера с future. Создается объект future с callable параметром. Но функция, переданная в объект не вызывается до тех пор, пока нам не нужен будет результат (до тех пор пока не вызовем функцию get).
0
Tulosba
:)
Эксперт С++
4397 / 3233 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
14.06.2013, 15:12 #30
Цитата Сообщение от ForEveR Посмотреть сообщение
До тех пор пока не вызовем future.get() функция вызвана не будет.
Как это не будет вызвана? А в чем смысл тогда async, если он не стартует до вызова get()?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
#include <thread>
#include <future>
 
int calculate()
{
   std::cout << "Time to sleep" << std::endl;
   std::this_thread::sleep_for(std::chrono::seconds(1));
   std::cout << "Wakeup" << std::endl;
   return 42;
}
 
int main()
{
   std::future<int> future = std::async(calculate);
   std::cout << "Future created, but not called" << std::endl;
   std::cout << "Call get on future" << std::endl;
   //std::cout << "Result is: " << future.get() << std::endl;
   std::this_thread::sleep_for(std::chrono::seconds(5));
}
VS 2012 - всё вызывает.
0
14.06.2013, 15:12
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.06.2013, 15:12
Привет! Вот еще темы с ответами:

Инициализация массива C++ - C++
Почему, если мы не инициализируем переменную, то при попытке работы с ней будет ошибка int main(){ char x; cout &lt;&lt; x; ...

Инициализация ссылок - C++
Непонятно почему такой синтаксис инициализации ссылок ошибочен: int * p(nullptr); int * &amp;pref(p); Требуется вот так: int *...

Инициализация вектора - C++
Как правильно инициализировать двумерный символьный вектор? Пробовал вот так, не получилось vector&lt; vector&lt;char&gt; &gt; map(2,...

Инициализация структур - C++
Не могу уловить по какой причине первый вариант рабочий: А этот нет:


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
30
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru