На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Правила раздела Visual C++ / MFC / WTL (далее Раздела)
1) На Раздел распространяются все Правила Форума.
2) Перед тем, как создать новый топик, убедитесь, что Вы читали Правила создания тем в Разделе.
3) Вопросы, не связанные с программированием (настройки MS Visual Studio, книги, библиотеки и т.д.),
обсуждаются в разделе C/C++: Прочее
4) Вопросы разработки .NET (Windows Form, C++/CLI и т.п.) приложений на Visual C++/C# обсуждаются в разделе .NET.
5) Нарушение Правил может повлечь наказание со стороны модераторов.

Полезные ссылки:
user posted image FAQ Раздела user posted image Обновления для FAQ Раздела user posted image Поиск по Разделу user posted image MSDN Library Online
Модераторы: ElcnU
  
> Параметру по умолчанию присваиваю член класса
    Параметру по умолчанию присваиваю член класса
    Короче делаю такую хрень в *.h

    ...
         bool PrintScreen( long fromRow=0,
                       long fromCol=0,
                       long toRow=m_countRows,
                       long toCol=m_countCols);

    protected:
         long m_countRows;                                                                  // количство строк
         long m_countCols;                                                                  // количество столбцов

    ...

    А компилятор говорит
    error C2648: 'm_countRows' : use of member as default parameter requires static member

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

      bool PrintScreen( long fromRow=0,  
          long fromCol=0,  
          long toRow=use_current_row,  
          long toCol=use_current_col)
      {
       if (toRow == use_current_row)
         toRow = m_countRows;
      .........
      }

      protected:
      long m_countRows;           // количство строк
      long m_countCols;           // количество столбцов

      Идея ясна?
      Возможно предложат и другие варианты.
      Естественно, что выбирать значение констант нужно такие, чтобы они никогда не могли быть спутаны с реальными возможными значениями параметров. В твоем случае я думаю это возможно.
        Stiff, а зачем передавать переменные в функцию, если они и так члены класса? Не судьба просто добавить параметр типа bUseDefaultValues = TRUE или типа того? Если он TRUE, то использовать m_*
          2Codemaster:
          но так придется или таскать лишний параметр функции или перегружать саму функцию, в данном случае пожалуй мой вариант легче.
            2Valery: ты, наверное, не понял. Я предложил члены класса не передавать в функцию, а добавить в неё параметр (со значением по умолчанию = TRUE), который определяет, как используются её аргументы.
              Отчего же не понял? Понял. Но человеку хотелось передавать параметры, и иногда это оправдано. Оценить оправданность этого подхода сейчас сложно, нужно анализировать часть проекта, но представить себе я такое могу.
              Ты предлагаешь _добавить_ параметр bUseDefaultValues. Тогда вызов функции для случая использования внешних значений выглядел бы так:
              bool PrintScreen(0, 0,  100,  100, FALSE);  
              Это к примеру в твоем случае.
              У меня было бы тоже самое, только без завершающего FALSE.
              В принципе жизнеспособны оба подхода. Убедил ли я тебя? Вряд ли. Ты - меня тоже. А вот Stiff пусть выбирает. Дело вкуса.
                Ну да, я просто в твоё решение не совсем сразу въехал. Моё можно назвать более универсальным, иногда не бывает "несущетвующих " значений, хотя в случае stiiff'a это не так.
                  консенсус :)
                    Хмм...
                    А если использовать так:

                    bool PrintScreen( long fromRow=0,  
                        long fromCol=0,  
                        long toRow=use_current_row,  
                        long toCol=use_current_col);

                    bool PrintScreen( long fromRow=0, long fromCol=0)
                        {
                            PrintScreen(fromRow, fromCol,
                                   m_countRows, m_countCols);
                        }
                     
                    protected:  
                    long m_countRows;      // количство строк  
                    long m_countCols;      // количество столбцов  


                    Или я в чем-то не прав?
                      Всем спасибо Я предпочел вариант Valery Другим просьба не обижаться
                      а теперь другая проблема немножко по другому поводу как реализовать operotor*

                      Я хотел сделать так

                      CMatrix operator *(CMatrix& newMatrix);

                      ...

                      CMatrix CMatrix:: operator *(CMatrix& newMatrix)
                      {
                        СMatrix ret_Matrix;
                        .....
                        return ret_Matrix;
                      }

                      но блин ret_Matrix уничтожается деструктором по return

                      Нужна идея ??? plz
                      Сообщение отредактировано: purpe -
                        2Stiff:
                        успокойся, все нормально с твоим оператором умножения. перед тем как умрет ret_Matrix, он отдается конструктору копирования. создается временный объект (именно он возвращается твоим оператором) а уж после этого вызывается деструктор ret_Matrix'а. Проверь только чтобы у тебя в классе Matrix был конструктор с такой сигнатурой:
                        Matrix(const Matrix &). Тот, который сгенерит комиллятор за тебя тебе скорее всего не подойдет.
                          Что -то я не понимаю Конструктор я сделал :

                          CMatrix(const CMatrix& newMatrix);

                          CMatrix::CMatrix(const CMatrix& newMatrix)
                          {
                             член = newMatrix.член  // Образно говоря
                          }

                          но все равно не получается я смотрел отладчиком по return он все равно сначала заходит в деструктор а потом делает return ret_Matrix`а который перед этим в деструкторе удалил и получается что член == 0
                            во-первых, это все-таки конструктор, поэтому пользуйся списком инициализации:
                            CMatrix(const CMatrix& newMatrix);

                            CMatrix::CMatrix(const CMatrix& newMatrix)
                            :    член (newMatrix.член)  // Образно говоря
                            {
                            }
                            во-вторых, говоришь смотрел под отладчиком?
                            если смотрел на уровне процессорных команд, то конечно деструктор отработает, до команды ret.
                            ежели конечно смотрел на уровне исходного кода, то, извини, смотрел скорее всего плохо.
                            если проблема останется, шли кусок проекта, посмотрю.
                            PS.А вообще чего вы все к этим матрицам привязались? ты уже 4 или 5 кто за последний месяц при мне тут с ними разбирается. Может имеет смысл найти хорошую реализацию матриц и не мудрить самому?
                              2Valery Привязался я к матрицам потому что в универе заставили C++ преподавать студентам которые вообще ничего не знают вот я и думаю чем их озадачить а на счет конструктора сейчас посмотрю ...
                                смотри мыло.
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0358 ]   [ 16 queries used ]   [ Generated: 2.05.24, 07:36 GMT ]