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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Что нужно работодателю? 
:(
    Опции темы
ManiaK
Дата 22.7.2005, 13:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Homo Sapience
***


Профиль
Группа: Комодератор
Сообщений: 1145
Регистрация: 3.8.2004
Где: ИУ5-93

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



Цитата(Vyacheslav @ 22.7.2005, 14:49)
Надеюсь ответ был получен в результате анализа кода, а прогона  ?

smile Обижаешь!..

Цитата(chaos @ 22.7.2005, 14:50)
результат не определен, тк первым инициализируется член а членами б и с каторые еще не инициализированы

Согласен. Переменные будут инициализироваться в порядке объявления.
PM MAIL WWW   Вверх
Orlan
Дата 22.7.2005, 13:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(Vyacheslav @ 22.7.2005, 11:21)
Код

class A {

  int a;
  int b;
  int c;
public:
  A(): c(5), b(c + 1) , a(c+b) { cout << a << endl << b << c << endl;  }
};
A a;

Результат?


???????????
???????????5

? - число, зависящие от компилятора (мусор)
a и b инициализируются мусором

Это сообщение отредактировал(а) Orlan - 22.7.2005, 13:55
--------------------
А вы знали, что терапевт - это 1024 гигапевта или 1048576 мегапевтов
PM MAIL   Вверх
ManiaK
Дата 22.7.2005, 13:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Homo Sapience
***


Профиль
Группа: Комодератор
Сообщений: 1145
Регистрация: 3.8.2004
Где: ИУ5-93

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



Цитата
http://forum.vingrad.ru/index.php?showtopic=59176&view=findpost&p=474337

Вот это сложно. Не друзей ли там звать? smile
PM MAIL WWW   Вверх
Vyacheslav
Дата 22.7.2005, 14:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(Orlan @ 22.7.2005, 13:48)
Access violation.
Функция A::func() не виртуальная и все зависит от того какой мусор будет лежать после указателя эту функцию в таблице виртуальных функция класса А

Ответ отрицательный. По-скольку метод не виртуальный, будет вызван метод класса, которым на момент вызвова представлен объект. В данном случае это класс B. Access violation возможен, если внутри функции будут связанные с модификацией членов класса B. Но в данном примере этого нет. Естественно пример с точки зрения норм не корректен, но здесь проверятся понимание различий между виртуальными и обычными методами.

Добавлено @ 14:02
Цитата(Orlan @ 22.7.2005, 13:54)
???????????
???????????5

? - число, зависящие от компилятора (мусор)
a и b инициализируются мусором

Это понятно. Прогнать я тоже могу. Почему это происходит?



--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
Orlan
Дата 22.7.2005, 14:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(Vyacheslav @ 22.7.2005, 14:00)

Цитата(Orlan @ 22.7.2005, )

???????????
???????????5

? - число, зависящие от компилятора (мусор)
a и b инициализируются мусором

Это понятно. Прогнать я тоже могу. Почему это происходит?

Потому что был создан объект int(5), но не было произведено присваивание полю с, которое происходит перед входом в тело конструктора. Окончательное конструирование происходит когда созданы базовые классы и все переменный посчитаны для присваивания полей

Это сообщение отредактировал(а) Orlan - 22.7.2005, 14:09
--------------------
А вы знали, что терапевт - это 1024 гигапевта или 1048576 мегапевтов
PM MAIL   Вверх
Vyacheslav
Дата 22.7.2005, 16:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(Orlan @ 22.7.2005, 14:08)
Потому что был создан объект int(5), но не было произведено присваивание полю с, которое происходит перед входом в тело конструктора. Окончательное конструирование происходит когда созданы базовые классы и все переменный посчитаны для присваивания полей

Ответ неверен. Порядок инициализации членов класса определяется не списком инициализации, а порядком их декларации в классе, то есть сначала должны были быть инициализированы a , b, а потом уж c. На момент инициализации а, в b и с лежал мусор. Соотвественно и а получил мусор. Аналогичная ситуация и для b.


--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
Orlan
Дата 22.7.2005, 16:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(Vyacheslav @ 22.7.2005, 16:05)
Порядок инициализации членов класса определяется не списком инициализации, а порядком их декларации в классе, то есть сначала должны были быть инициализированы a , b, а потом уж c. На момент инициализации а,  в  b и с лежал мусор. Соотвественно и а  получил мусор. Аналогичная ситуация и для b.

Ни когда бы не рискнул надеятся на порядок декларации членов класса. Трудно поверить что такое может быть записано в стандарте С++.
А есть ли хорошие учебники/сайты, где описаны подобные тонкости С++ или надо штудировать стандарт?
--------------------
А вы знали, что терапевт - это 1024 гигапевта или 1048576 мегапевтов
PM MAIL   Вверх
Vyacheslav
Дата 22.7.2005, 17:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(Orlan @ 22.7.2005, 16:56)
Ни когда бы не рискнул надеятся на порядок декларации членов класса. Трудно поверить что такое может быть записано в стандарте С++.

См 12.6.2 5
Цитата

... nonstatic data members shall be initilized in order they declared in the class definition(again regardless of the order of the mem-initializers)




--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
Дрон
Дата 22.7.2005, 18:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Java-ненавистник :)
****


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

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



Вот поэтому я списком инициализации никогда не пользуюсь. Зачем лишний геморрой выдумывать? smile


--------------------
Да. Именно так.
PM   Вверх
Earnest
Дата 22.7.2005, 19:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

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



Цитата

class A {
protected:
  void func();
};

class B : public  A {
public:
//что написать здесь
};

Как в классе B сделать func public, не перекрывая ее.


Код

class B : public  A {
public:
   using A::func;
};



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


Новичок



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

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



Цитата
Вот поэтому я списком инициализации никогда не пользуюсь. Зачем лишний геморрой выдумывать?


Дрон, без этого способа невозможно инициализировать поля-константы, поля-ссылки и поля-объекты.
PM MAIL   Вверх
Mayk
Дата 23.7.2005, 17:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


^аВаТаР^ сообщение>>
****


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

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



Что-то стало пусто. Чтобы совсем не скучать, вот вам две задачки: одна легкая, другая интересная.
1) Чем плох этот кот?
Код

int someFunc(int a)
{
    try{
        if(a<=0) throw invalid_argument("a must be positive");
        char* b  = new char[a];        
        if(a * a * 7 > 25){ 
             throw logic_error("some logic error");
        }    
   } catch (logic_error) {
        cerr << "logic error" << endl;
   } catch (invalid_argument) {
        cerr << "invalid argument" << endl;
   } catch (bad_alloc) {
        cerr << "memory error" << endl;
   }        
}


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

int f6 = fibonaci(6);

где fibonaci - обычная ф-ция, то вы должны сделать
Код

int f6 = что-то-от-6.

Где что-то-от-6 не является ф-цией.
Решите задачу не вводя дополнительных переменных.
Решите задачу так, чтобы в коде
Код

int f6=что-то-от-6.
int f66=что-то-от-66

обе переменные инициализировались за одинаковое время.


--------------------
 Здесь был кролик. Но его убили.
Человеки < кроликов, йа считаю.
PM MAIL WWW ICQ   Вверх
Void
Дата 23.7.2005, 19:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

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



Mayk
1-я задача.
1) Течет память. При пробросе std::logic_error b не будет освобожден. Решение: использовать смарт-пойнтер, например, std::auto_ptr.
2) Исключения invalid_argument не будет поймано надлежащим образом, потому что соотвествующий хэндлер идет после хэндлера std::logic_error, от которого он наследуется. Исключения желательно ловить по const-reference, а не by value - во избежание срезки или исключения в копикторе.

2-я задача.
Код

template <unsigned Num>
struct fibonacci {
    enum { N = fibonacci<Num - 1>::N + fibonacci<Num - 2>::N };
};

template <>
struct fibonacci<1> {
    enum { N = 1 };
};

template <>
struct fibonacci<0> {
    enum { N = 1 };
};

int f6 = fibonacci<6>::N;



--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
Mayk
Дата 23.7.2005, 20:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


^аВаТаР^ сообщение>>
****


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

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



Void
Угу. smile




--------------------
 Здесь был кролик. Но его убили.
Человеки < кроликов, йа считаю.
PM MAIL WWW ICQ   Вверх
ManiaK
Дата 25.7.2005, 07:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Homo Sapience
***


Профиль
Группа: Комодератор
Сообщений: 1145
Регистрация: 3.8.2004
Где: ИУ5-93

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



Цитата(Earnest @ 22.7.2005, 20:03)
using A::func;

Махать!.. Век живи - век учись smile
PM MAIL WWW   Вверх
Страницы: (7) Все « Первая ... 3 4 [5] 6 7 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
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.0755 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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