На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Правила раздела:
1. Название темы - краткое описание кто/что против кого/чего
2. В первом сообщении - список параметров, по которым идет сравнение.
3. Старайтесь аргументировать свои высказывания. Фразы типа "Венда/Слюникс - ацтой" считаются флудом.
4. Давайте жить дружно и не доводить обсуждение до маразма и личных оскорблений.
Модераторы: Модераторы, Комодераторы
Страницы: (14) « Первая ... 5 6 [7] 8 9 ...  13 14 все  ( Перейти к последнему сообщению )  
> Классы в СИ++ , нужна консультация
    Цитата KILLER @
    memset(m_name, 0, sizeof(m_name));
    strncpy(m_name, rhs.m_name, sizeof(m_name));
    m_dob = rhs.m_dob;

    Не правильно :D Тогда уж strncpy(m_name, rhs.m_name, sizeof(m_name) - 1). Да и вообще обычно пользуются strlcpy / strcpy_s (в зависимости от компилятора, можно макрос даже сделать).
    Сообщение отредактировано: shm -
      Цитата shm @
      Не правильно :D Тогда уж strncpy(m_name, rhs.m_name, sizeof(m_name) - 1). Да и вообще обычно пользуются strlcpy / strcpy_s (в зависимости от компилятора, можно макрос даже сделать).

      Да, -1 нужно. Все верно, а вот насчет этих strlcpy/strcpy_s - компиляторозависимые, не юзал их и юзать не собираюсь. У меня таких проблем нет. Я std::string юзаю. Раз как то приходилось на С модуль под апаче писать, там свои strcpy встроенные есть, так что както обходился без этих встроенных.
      Сообщение отредактировано: KILLER -
        Опять же для конструктора копирования подойдет обычный strcpy - строка заведомо корректна.

        Добавлено
        Цитата KILLER @
        Я std::string юзаю.

        Это еще правильнее.
          Цитата shm @
          Опять же для конструктора копирования подойдет обычный strcpy - строка заведомо корректна.

          Да там можно исправлять, и еще проще переписать. Яж так на коленке. Еще Славян меня немного запутал этими strcpy/strncpy. Я год уже на С++ не пишу, на шарп перешел. Я чтоб не забыть С++ сюда заглядываю в основном.

          Добавлено
          Но если еще что то найдешь как можно проще написать - пиши, буду рад. Не хочу С++ забывать, а времени щас на нем нет писать. Я то тут с удовольствием темы читаю.

          Добавлено
          Я там еще хотел в список инициализации впендюрить m_dob - но побоялся, у меня в классе первым идет m_name, нужно либо порядок объявления членов класса изменить, или можно было m_dob в списке инициализации инициализировать? Как там по стандарту?

          Добавлено
          Цитата smailvolf @
          спасибо, уже ничего не нужно.... сама все сделала и по-другому чем было сделано здесь

          Так и что, так и не покажешь, что ты сама сделала? :D Интересно же :blush:
            Цитата KILLER @
            Я там еще хотел в список инициализации впендюрить m_dob - но побоялся, у меня в классе первым идет m_name, нужно либо порядок объявления членов класса изменить, или можно было m_dob в списке инициализации инициализировать?

            Тут порядок инициализации не при делах. Он имеет место только, когда ты, например, инициализируешь члены класса другими членами этого класса.

            Добавлено
            Вообще, самое интересное в этом задании - это именно, то что вы оба сознательно или нет проигнорировали, а именно ввод значений со стандартного потока. Пикантности добавляет, что в задании никак не оговорено как обрабатывать ошибки, когда, например, пользователь ввел недопустимый год.
            Сообщение отредактировано: shm -
              Цитата shm @
              Тут порядок инициализации не при делах. Он имеет место только, когда ты, например, инициализируешь члены класса другими членами этого класса.

              Ну в конкретно данном случае - возможно. Но ведь они инициализируются извне, то есть ворнинг может быть? Я просто помню одну проблему на которую нарвался один чел, а я за него разбирал ее. Там прикол получился в том, что была статическая функция, в которую передавался какой то параметр класса, и она должна была инициализировать какой то член класса. И получилось так, что на момент инициализации этого члена класса, то что она принимала - еще небыло создано. Ну както так. Я щас в деталях не помню. Но ошибка была вот именно в порядке инициализации членов класса. Я после этого всегда стараюсь инициализировать их в списке инициализации именно так как они объявлены в классе. И до этого как бы знал про такое, но на практике не встречался. А потом вот столкнулся.

              Добавлено
              Цитата shm @
              Вообще, самое интересное в этом задании - это именно, то что вы оба сознательно или нет проигнорировали, а именно ввод значений со стандартного потока. Пикантности добавляет, что в задании никак не оговорено как обрабатывать ошибки, когда, например, пользователь ввел недопустимый год.

              Ну я сознательно его пропустил, я так понимаю его и нужно было считывать функцией scanf, мне лень просто было дописывать. Я просто написал класс и протестировал все его методы/конструкторы.

              Добавлено
              Причем в ТЗ напрямую об этом не сказано. Там вскользь упоминается scanf и все.
                Цитата KILLER @
                Я после этого всегда стараюсь инициализировать их в списке инициализации именно так как они объявлены в классе.

                ЕМНИП, объекты инициализируются в том порядке, в каком они объявлены в классе, при этом порядок их перечисления в конструкторе не имеет значения. Вот от этого все и грабли.
                Сообщение отредактировано: shm -
                  Цитата shm @
                  Пикантности добавляет, что в задании никак не оговорено как обрабатывать ошибки, когда, например, пользователь ввел недопустимый год.

                  Вообще - да, странно, могу предположить что у них первый урок по классам был, или действительно не объясняли - что довольно странно, может просто не стали грузить ошибками. Хотя условия вроде еще до классов должны проходить. В общем тайна покрытая мраком.

                  Добавлено
                  Цитата shm @

                  ЕМНИП, объекты инициализируются в том порядке, в каком они объявлены в классе, при этом порядок их перечисления в конструкторе не имеет значения.

                  В самом теле конструктора - да, не имеет. Я имею ввиду список инициализации, ЕМНИП там порядок объявления членов класса - важен.

                  Добавлено
                  Список инициализации конструктора в смысле, ну типа:
                  ExpandedWrap disabled
                    Cat(const char* name, int dob)
                    : m_dob(dob) //! Вот тут порядок инициализации членов класса важен должно все инициализироваться в том же порядке, в котором объявляется
                    {
                    tralala
                    }
                  Сообщение отредактировано: KILLER -
                    Цитата KILLER @
                    ЕМНИП там порядок объявления членов класса - важен.

                    А я тебе про что говорю?
                    Цитата shm @
                    объекты инициализируются в том порядке, в каком они объявлены в классе
                      Цитата shm @
                      А я тебе про что говорю?

                      Ну смотри, инициализировать можно двумя способами:
                      1) Тут порядок в каком ты что будешь инициализировать - не важен:
                      ExpandedWrap disabled
                        Cat(const std::string& name, int dob)
                        {
                           m_dob = dob;
                           m_name = name;
                        }

                      2) Вот тут порядок в каком ты будешь инициализировать члены класса - важен:
                      ExpandedWrap disabled
                        Cat(const std::string& name, int dob)
                        :  m_dob(dob),
                           m_name(name)
                        {
                        }

                      И вот на втором варианте - я на практике подловился, было что то типа того:
                      ExpandedWrap disabled
                        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;
                            }
                        };

                      Вот что то типа того.

                      Добавлено
                      Да и если ты их будешь инициализировать в разном порядке - выскочит ворнинг.
                      Сообщение отредактировано: KILLER -
                        Цитата shm @
                        : a1(Calculate(a2)),

                        Неправильно, у тебя а2 не инициализирован на момент инициализации а1.

                        Добавлено
                        Цитата KILLER @
                        2) Вот тут порядок в каком ты будешь инициализировать члены класса - важен:

                        Тут тоже не важен.

                        Добавлено
                        Вот самый простой пример, когда важен:
                        ExpandedWrap disabled
                          class A
                          {
                            int a;
                            int b;
                          public:
                            A(int val) :
                              b(val), a(b)
                            {
                            }
                          };

                        ExpandedWrap disabled
                          class A
                          {
                            int b;
                            int a;
                          public:
                            A(int val) :
                              b(val), a(b)
                            {
                            }
                          };

                        корректен только второй вариант.
                        Сообщение отредактировано: shm -
                          Цитата shm @
                          Неправильно, у тебя а2 не инициализирован на момент инициализации а1.

                          Так все верно, я тебе пример привел - что в данном случае порядок инициализации - важен.

                          Цитата shm @
                          Тут тоже не важен.

                          Так ведь:
                          Цитата shm @
                          Неправильно, у тебя а2 не инициализирован на момент инициализации а1.


                          Значит у меня a2 уже инициализирована на момент передачи ее в статический метод. разве нет?

                          Цитата shm @
                          Вот самый простой пример, когда важен:

                          Ну значит я сложный привел. Просто фишка в том, что в списке инициализации у конструктора - порядок инициализации членов - должен совпадать с порядком их объявления, на сколько я помню. Даже если ты все просто числами инициализируешь, но не в том порядке - будет ворнинг.
                          Сообщение отредактировано: KILLER -
                            Цитата KILLER @
                            Значит у меня a2 уже инициализирована на момент передачи ее в статический метод. разве нет?

                            В чем смысл писать вопрос явно противоречащий цитируемой фразе?

                            Добавлено
                            Цитата KILLER @
                            что в списке инициализации у конструктора - порядок инициализации членов - должен совпадать с порядком их объявления

                            Нет! Я тебе сразу написал: что порядок инициализации членов не зависит от порядка их инициализации в конструкторе.

                            Добавлено
                            Так тоже корректно:
                            ExpandedWrap disabled
                                  class A
                                  {
                                    int b;
                                    int a;
                                  public:
                                    A(int val) :
                                      a(b), b(val)
                                    {
                                    }
                                  };

                            но лучше так не писать, ибо можно самому запутаться.
                            Сообщение отредактировано: shm -
                              Цитата shm @
                              В чем смысл писать вопрос явно противоречащий цитируемой фразе?

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

                              Цитата shm @
                              Нет! Я тебе разу написал: что порядок инициализации членов не зависит от их инициализации в конструкторе.

                              Нет, ты не так написал, ты написал вот так:
                              Цитата shm @
                              ЕМНИП, объекты инициализируются в том порядке, в каком они объявлены в классе,

                              Я же несколько раз уточнил и написал - если я инициализирую члены класса в списке инициализации конструктора, а не в теле конструктора - то влияет!

                              Добавлено
                              Цитата shm @
                              Так тоже корректно:
                              ExpandedWrap disabled
                                        class A
                                        {
                                          int b;
                                          int a;
                                        public:
                                          A(int val) :
                                            a(b), b(val)
                                          {
                                          }
                                        };

                              Вот об этом я и говорю - так не верно, и это следует из моего примера со статической функцией. Это потенциальная ошибка, или другими словами - ворнинг. Это как если ты никогда не будешь указатели на NULL проверять перед их использованием - может прокатит, а может и нет.
                              Сообщение отредактировано: KILLER -
                                Цитата KILLER @
                                но в первом будет исключение

                                Нет Киля, ты видимо тоже меня читаешь по диагонали: у тебя три примера: первые два правильные, третий - нет.
                                Цитата KILLER @
                                Нет, ты не так написал, ты написал вот так:

                                А где противоречие?

                                Добавлено
                                Цитата KILLER @
                                Вот об этом я и говорю - так не верно

                                Вот я не понимаю. Ты сюда пришел спрашивать или доказывать свою точку зрения?

                                Добавлено
                                Хорошо, вот тебе тест на все три моих примера: раз, два, три.
                                1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
                                0 пользователей:
                                Страницы: (14) « Первая ... 5 6 [7] 8 9 ...  13 14 все


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0615 ]   [ 14 queries used ]   [ Generated: 18.05.24, 14:49 GMT ]