Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.218.66.149] |
|
Страницы: (14) « Первая ... 5 6 [7] 8 9 ... 13 14 все ( Перейти к последнему сообщению ) |
Сообщ.
#91
,
|
|
|
Цитата KILLER @ memset(m_name, 0, sizeof(m_name)); strncpy(m_name, rhs.m_name, sizeof(m_name)); m_dob = rhs.m_dob; Не правильно Тогда уж strncpy(m_name, rhs.m_name, sizeof(m_name) - 1). Да и вообще обычно пользуются strlcpy / strcpy_s (в зависимости от компилятора, можно макрос даже сделать). |
Сообщ.
#92
,
|
|
|
Цитата shm @ Не правильно Тогда уж strncpy(m_name, rhs.m_name, sizeof(m_name) - 1). Да и вообще обычно пользуются strlcpy / strcpy_s (в зависимости от компилятора, можно макрос даже сделать). Да, -1 нужно. Все верно, а вот насчет этих strlcpy/strcpy_s - компиляторозависимые, не юзал их и юзать не собираюсь. У меня таких проблем нет. Я std::string юзаю. Раз как то приходилось на С модуль под апаче писать, там свои strcpy встроенные есть, так что както обходился без этих встроенных. |
Сообщ.
#93
,
|
|
|
Опять же для конструктора копирования подойдет обычный strcpy - строка заведомо корректна.
Добавлено Цитата KILLER @ Я std::string юзаю. Это еще правильнее. |
Сообщ.
#94
,
|
|
|
Цитата shm @ Опять же для конструктора копирования подойдет обычный strcpy - строка заведомо корректна. Да там можно исправлять, и еще проще переписать. Яж так на коленке. Еще Славян меня немного запутал этими strcpy/strncpy. Я год уже на С++ не пишу, на шарп перешел. Я чтоб не забыть С++ сюда заглядываю в основном. Добавлено Но если еще что то найдешь как можно проще написать - пиши, буду рад. Не хочу С++ забывать, а времени щас на нем нет писать. Я то тут с удовольствием темы читаю. Добавлено Я там еще хотел в список инициализации впендюрить m_dob - но побоялся, у меня в классе первым идет m_name, нужно либо порядок объявления членов класса изменить, или можно было m_dob в списке инициализации инициализировать? Как там по стандарту? Добавлено Цитата smailvolf @ спасибо, уже ничего не нужно.... сама все сделала и по-другому чем было сделано здесь Так и что, так и не покажешь, что ты сама сделала? Интересно же |
Сообщ.
#95
,
|
|
|
Цитата KILLER @ Я там еще хотел в список инициализации впендюрить m_dob - но побоялся, у меня в классе первым идет m_name, нужно либо порядок объявления членов класса изменить, или можно было m_dob в списке инициализации инициализировать? Тут порядок инициализации не при делах. Он имеет место только, когда ты, например, инициализируешь члены класса другими членами этого класса. Добавлено Вообще, самое интересное в этом задании - это именно, то что вы оба сознательно или нет проигнорировали, а именно ввод значений со стандартного потока. Пикантности добавляет, что в задании никак не оговорено как обрабатывать ошибки, когда, например, пользователь ввел недопустимый год. |
Сообщ.
#96
,
|
|
|
Цитата shm @ Тут порядок инициализации не при делах. Он имеет место только, когда ты, например, инициализируешь члены класса другими членами этого класса. Ну в конкретно данном случае - возможно. Но ведь они инициализируются извне, то есть ворнинг может быть? Я просто помню одну проблему на которую нарвался один чел, а я за него разбирал ее. Там прикол получился в том, что была статическая функция, в которую передавался какой то параметр класса, и она должна была инициализировать какой то член класса. И получилось так, что на момент инициализации этого члена класса, то что она принимала - еще небыло создано. Ну както так. Я щас в деталях не помню. Но ошибка была вот именно в порядке инициализации членов класса. Я после этого всегда стараюсь инициализировать их в списке инициализации именно так как они объявлены в классе. И до этого как бы знал про такое, но на практике не встречался. А потом вот столкнулся. Добавлено Цитата shm @ Вообще, самое интересное в этом задании - это именно, то что вы оба сознательно или нет проигнорировали, а именно ввод значений со стандартного потока. Пикантности добавляет, что в задании никак не оговорено как обрабатывать ошибки, когда, например, пользователь ввел недопустимый год. Ну я сознательно его пропустил, я так понимаю его и нужно было считывать функцией scanf, мне лень просто было дописывать. Я просто написал класс и протестировал все его методы/конструкторы. Добавлено Причем в ТЗ напрямую об этом не сказано. Там вскользь упоминается scanf и все. |
Сообщ.
#97
,
|
|
|
Цитата KILLER @ Я после этого всегда стараюсь инициализировать их в списке инициализации именно так как они объявлены в классе. ЕМНИП, объекты инициализируются в том порядке, в каком они объявлены в классе, при этом порядок их перечисления в конструкторе не имеет значения. Вот от этого все и грабли. |
Сообщ.
#98
,
|
|
|
Цитата shm @ Пикантности добавляет, что в задании никак не оговорено как обрабатывать ошибки, когда, например, пользователь ввел недопустимый год. Вообще - да, странно, могу предположить что у них первый урок по классам был, или действительно не объясняли - что довольно странно, может просто не стали грузить ошибками. Хотя условия вроде еще до классов должны проходить. В общем тайна покрытая мраком. Добавлено Цитата shm @ ЕМНИП, объекты инициализируются в том порядке, в каком они объявлены в классе, при этом порядок их перечисления в конструкторе не имеет значения. В самом теле конструктора - да, не имеет. Я имею ввиду список инициализации, ЕМНИП там порядок объявления членов класса - важен. Добавлено Список инициализации конструктора в смысле, ну типа: Cat(const char* name, int dob) : m_dob(dob) //! Вот тут порядок инициализации членов класса важен должно все инициализироваться в том же порядке, в котором объявляется { tralala } |
Сообщ.
#99
,
|
|
|
Цитата KILLER @ ЕМНИП там порядок объявления членов класса - важен. А я тебе про что говорю? Цитата shm @ объекты инициализируются в том порядке, в каком они объявлены в классе |
Сообщ.
#100
,
|
|
|
Цитата shm @ А я тебе про что говорю? Ну смотри, инициализировать можно двумя способами: 1) Тут порядок в каком ты что будешь инициализировать - не важен: Cat(const std::string& name, int dob) { m_dob = dob; m_name = name; } 2) Вот тут порядок в каком ты будешь инициализировать члены класса - важен: Cat(const std::string& name, int dob) : m_dob(dob), m_name(name) { } И вот на втором варианте - я на практике подловился, было что то типа того: class A { private: int a1; int a2; int a3; public: A() : a1(Calculate(a2)), a2(1), a3(5) { } static int Calculate(int param) { return param + 1; } }; Вот что то типа того. Добавлено Да и если ты их будешь инициализировать в разном порядке - выскочит ворнинг. |
Сообщ.
#101
,
|
|
|
Цитата shm @ : a1(Calculate(a2)), Неправильно, у тебя а2 не инициализирован на момент инициализации а1. Добавлено Цитата KILLER @ 2) Вот тут порядок в каком ты будешь инициализировать члены класса - важен: Тут тоже не важен. Добавлено Вот самый простой пример, когда важен: class A { int a; int b; public: A(int val) : b(val), a(b) { } }; class A { int b; int a; public: A(int val) : b(val), a(b) { } }; корректен только второй вариант. |
Сообщ.
#102
,
|
|
|
Цитата shm @ Неправильно, у тебя а2 не инициализирован на момент инициализации а1. Так все верно, я тебе пример привел - что в данном случае порядок инициализации - важен. Цитата shm @ Тут тоже не важен. Так ведь: Цитата shm @ Неправильно, у тебя а2 не инициализирован на момент инициализации а1. Значит у меня a2 уже инициализирована на момент передачи ее в статический метод. разве нет? Цитата shm @ Вот самый простой пример, когда важен: Ну значит я сложный привел. Просто фишка в том, что в списке инициализации у конструктора - порядок инициализации членов - должен совпадать с порядком их объявления, на сколько я помню. Даже если ты все просто числами инициализируешь, но не в том порядке - будет ворнинг. |
Сообщ.
#103
,
|
|
|
Цитата KILLER @ Значит у меня a2 уже инициализирована на момент передачи ее в статический метод. разве нет? В чем смысл писать вопрос явно противоречащий цитируемой фразе? Добавлено Цитата KILLER @ что в списке инициализации у конструктора - порядок инициализации членов - должен совпадать с порядком их объявления Нет! Я тебе сразу написал: что порядок инициализации членов не зависит от порядка их инициализации в конструкторе. Добавлено Так тоже корректно: class A { int b; int a; public: A(int val) : a(b), b(val) { } }; но лучше так не писать, ибо можно самому запутаться. |
Сообщ.
#104
,
|
|
|
Цитата shm @ В чем смысл писать вопрос явно противоречащий цитируемой фразе? Там продолжение мысли было. Я тебе привел два варианта одинаковых - но в первом будет исключение, а второй отработает без ошибок(хоть и ворнинг вылезет), ты сказал что первый неправильный, а второй правильный. Второй точже не правильный - потому что там тоже неверный порядок инициализации. Вот я тебе и привел первый пример как факт доказывающий то, что второй тоже неверно инициализируется, т.к. нарушается порядок инициализации членов класса. Просто это выглядело както по другому со стороны. Цитата shm @ Нет! Я тебе разу написал: что порядок инициализации членов не зависит от их инициализации в конструкторе. Нет, ты не так написал, ты написал вот так: Цитата shm @ ЕМНИП, объекты инициализируются в том порядке, в каком они объявлены в классе, Я же несколько раз уточнил и написал - если я инициализирую члены класса в списке инициализации конструктора, а не в теле конструктора - то влияет! Добавлено Цитата shm @ Так тоже корректно: class A { int b; int a; public: A(int val) : a(b), b(val) { } }; Вот об этом я и говорю - так не верно, и это следует из моего примера со статической функцией. Это потенциальная ошибка, или другими словами - ворнинг. Это как если ты никогда не будешь указатели на NULL проверять перед их использованием - может прокатит, а может и нет. |
Сообщ.
#105
,
|
|
|
Цитата KILLER @ но в первом будет исключение Нет Киля, ты видимо тоже меня читаешь по диагонали: у тебя три примера: первые два правильные, третий - нет. Цитата KILLER @ Нет, ты не так написал, ты написал вот так: А где противоречие? Добавлено Цитата KILLER @ Вот об этом я и говорю - так не верно Вот я не понимаю. Ты сюда пришел спрашивать или доказывать свою точку зрения? Добавлено Хорошо, вот тебе тест на все три моих примера: раз, два, три. |