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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Использование собственного инициализатора, Задача из Страуструпа 
V
    Опции темы
Kuvaldis
Дата 16.10.2007, 01:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


механик-вредитель
***


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

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



Наткнулся на такую задачку у Страуструпа:
Найдите пример, когда имеет смысл воспользоваться именем в его собственном инициализаторе.
Как я понимаю, должно быть что-то вроде такого:
Код

int x = x;

Но моя башка отказывается производить какие-либо здравые идеи.
Что имел в виду Страуструп?



--------------------
Помни - когда ты спишь, враг не дремлет
Спи чаще и дольше, изматывай врага бессоницей
PM MAIL ICQ   Вверх
Daevaorn
Дата 16.10.2007, 08:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Код

struct Foo
{
    int bar;
    Foo(int bar):bar(bar){}
};

?
PM MAIL WWW   Вверх
archimed7592
Дата 16.10.2007, 09:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


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

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



Daevaorn, ну это же имена разных сущностей smile.


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
Daevaorn
Дата 16.10.2007, 09:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(archimed7592 @  16.10.2007,  10:03 Найти цитируемый пост)
, ну это же имена разных сущностей 

но одинаковые же имена;)
PM MAIL WWW   Вверх
akizelokro
Дата 16.10.2007, 09:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Крокодил
**


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

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



"Найдите пример, когда имеет смысл воспользоваться именем в его собственном инициализаторе."

Раз ни у кого нет здравых замечаний, тогда уже пропишусь я. Подобный пример приведен у Стэнли Б.Липпмана. Daeavaorn прописал только окончание примера. Пример используется для обучения новичков (используется в образовательных целях), чтобы рассмотреть область видимости класса.

Код

int _height;

class Screen {
public:
   Screen( int _height ) {
      _height = 0;   // к чему относится _height? К параметру
      this->_height = 0;   // относится к Screen::_height
      // тоже правильно:
      // Screen::_height = 0;
   }
private:
   short _height;
};


Ну, здесь я прикопался к словам автора темы. Специально для экспертов поясню, что это шутка.


--------------------
a = a + b; b = a - b; a = a - b;
PM MAIL   Вверх
Kuvaldis
Дата 16.10.2007, 10:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


механик-вредитель
***


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

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



Daevaorn, akizelokro, правы, черт возьми. А я тупанул :(
Вопрос закрыт.


--------------------
Помни - когда ты спишь, враг не дремлет
Спи чаще и дольше, изматывай врага бессоницей
PM MAIL ICQ   Вверх
akizelokro
Дата 16.10.2007, 10:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Крокодил
**


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

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



Теперь без шуточек. У Страуструпа написано, что иногда важен порядок инициализации. Возможно ли это объяснение?
Еще я вчера ковырялся над примером, как обойти обязательную инициализацию const члена класса. Пробовал это сделать через union, но посчитал, что анонимное объединение накладывает слишком много дополнительных требований, поэтому попытался выкинуть фортель вида

Код

class M1
{
  const struct Mqqq...{....};
  ...
};

class M2
{
  struct Mqqq...{....};
  ...
};

M1* m1 = new M1;
// присвоения значений
M2 * m2 = new (m1) M2;


При определенных условиях (если компилятор не зачищает уже выделенную память из хипа) , это может пройти. И в этом случае какая-то информация (возможно полезная уже содержится даже перед инициализацией обьекта). Но тут мне не хватает знаний и я еще подумаю..



--------------------
a = a + b; b = a - b; a = a - b;
PM MAIL   Вверх
archimed7592
Дата 16.10.2007, 10:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


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

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



Цитата(akizelokro @  16.10.2007,  10:18 Найти цитируемый пост)
Теперь без шуточек. У Страуструпа написано, что иногда важен порядок инициализации. Возможно ли это объяснение?

Не совсем понимаю фразу "возможно ли это объяснение?", но, осмелюсь предположить, что ты просишь объяснить что это значит... Объясняю:
Код

class A
{
    double r;
    double x;
    double y;
public:
    A(double x_, double y_)
        : x(x_), y(y_), r(x * x + y * y)
    { }
    // в реальности порядок будет следующий:
    // r, x, y - мусор
    // r = x * x + y * y = мусор в квадрате + мусор в квадрате = мусор
    // x = x_
    // y = y_
}



Цитата(akizelokro @  16.10.2007,  10:18 Найти цитируемый пост)
поэтому попытался выкинуть фортель вида

Я считаю, что чем "выкидывать фортеля" лучше подумать как перепроектировать эту сущность так, чтобы фортеля не понадобились.


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
akizelokro
Дата 16.10.2007, 11:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Крокодил
**


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

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



Нет, с этим примером то как раз все понятно. Правильно задать вопрос я сейчас просто не могу, так что вам придется подождать.

Код

Я считаю, что чем "выкидывать фортеля" лучше подумать как перепроектировать эту сущность так, чтобы фортеля не понадобились. 


Ну с этим достаточно тоже все просто (в границах проработанных разделов). Но я для себя при подготовке считаю, что должен знать и как "надо" писать код, и как "нужно" и как не надо. В этом мой подход отличается.



Это сообщение отредактировал(а) akizelokro - 16.10.2007, 11:15


--------------------
a = a + b; b = a - b; a = a - b;
PM MAIL   Вверх
maxim1000
Дата 16.10.2007, 13:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



а что, если так:
Код

struct ListItem
{
    int Value;
    ListItem *Next;
    ListItem(int value,ListItem *next):Value(value),Next(next) {}
};

ListItem loop(1,&loop);

?

Это сообщение отредактировал(а) maxim1000 - 16.10.2007, 13:08


--------------------
qqq
PM WWW   Вверх
archimed7592
Дата 16.10.2007, 13:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


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

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



Гхм... Вродь как имя инжектиться в scope только после declaration-statement... Почему тогда это компилируется? 0_о

Добавлено через 18 секунд
(mingw-g++-3.4.2)


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
maxim1000
Дата 16.10.2007, 14:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



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


--------------------
qqq
PM WWW   Вверх
archimed7592
Дата 16.10.2007, 14:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


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

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



И тем не менее, вопрос, почему это компилируется остаётся открытым smile.


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
UnrealMan
Дата 16.10.2007, 18:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(maxim1000 @  16.10.2007,  15:30 Найти цитируемый пост)
вообще-то я не пробовал скомпилить, просто пытался придумать ситуацию, когда это теоретически может пригодиться, не обязательно корректную... 

Вполне корректный (с точки зрения компилируемости) код.
PM MAIL   Вверх
SergeCpp
Дата 16.10.2007, 23:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


 
**


Профиль
Группа: Участник
Сообщений: 955
Регистрация: 8.8.2005
Где: At Home

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



Относительно заглавного вопроса темы, помнится, использовал

Код
void LifeView::DrawFull( BYTE* ArrayScan, long beg_x, long beg_y, UINT cnt_x, UINT cnt_y )
{
    do
    {
        long beg_x( beg_x );
        UINT cnt_x( cnt_x );

        // bulk

        while( cnt_x >= ADJ_ELEMS )
        {
//... файл LifeView.cpp


PM MAIL WWW ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
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.0625 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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