Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.117.137.64] |
|
Сообщ.
#1
,
|
|
|
Параметру по умолчанию присваиваю член класса
Короче делаю такую хрень в *.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 Как это обойти уж очень хочется |
Сообщ.
#2
,
|
|
|
тут уж компилятор прав.
действительно взять нестатический член класса в качестве параметра передаваемого функции-члену этого же класса у тебя не получится. но ты можешь передать некое значение (например перечисление из этого же класса), которое будет означать, что необходимо использовать вместо него значения члена-данного этого класса. например так: 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; // количество столбцов Идея ясна? Возможно предложат и другие варианты. Естественно, что выбирать значение констант нужно такие, чтобы они никогда не могли быть спутаны с реальными возможными значениями параметров. В твоем случае я думаю это возможно. |
Сообщ.
#3
,
|
|
|
Stiff, а зачем передавать переменные в функцию, если они и так члены класса? Не судьба просто добавить параметр типа bUseDefaultValues = TRUE или типа того? Если он TRUE, то использовать m_*
|
Сообщ.
#4
,
|
|
|
2Codemaster:
но так придется или таскать лишний параметр функции или перегружать саму функцию, в данном случае пожалуй мой вариант легче. |
Сообщ.
#5
,
|
|
|
2Valery: ты, наверное, не понял. Я предложил члены класса не передавать в функцию, а добавить в неё параметр (со значением по умолчанию = TRUE), который определяет, как используются её аргументы.
|
Сообщ.
#6
,
|
|
|
Отчего же не понял? Понял. Но человеку хотелось передавать параметры, и иногда это оправдано. Оценить оправданность этого подхода сейчас сложно, нужно анализировать часть проекта, но представить себе я такое могу.
Ты предлагаешь _добавить_ параметр bUseDefaultValues. Тогда вызов функции для случая использования внешних значений выглядел бы так: bool PrintScreen(0, 0, 100, 100, FALSE); Это к примеру в твоем случае. У меня было бы тоже самое, только без завершающего FALSE. В принципе жизнеспособны оба подхода. Убедил ли я тебя? Вряд ли. Ты - меня тоже. А вот Stiff пусть выбирает. Дело вкуса. |
Сообщ.
#7
,
|
|
|
Ну да, я просто в твоё решение не совсем сразу въехал. Моё можно назвать более универсальным, иногда не бывает "несущетвующих " значений, хотя в случае stiiff'a это не так.
|
Сообщ.
#8
,
|
|
|
консенсус
|
Сообщ.
#9
,
|
|
|
Хмм...
А если использовать так: 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; // количество столбцов Или я в чем-то не прав? |
Сообщ.
#10
,
|
|
|
Всем спасибо Я предпочел вариант Valery Другим просьба не обижаться
а теперь другая проблема немножко по другому поводу как реализовать operotor* Я хотел сделать так CMatrix operator *(CMatrix& newMatrix); ... CMatrix CMatrix:: operator *(CMatrix& newMatrix) { СMatrix ret_Matrix; ..... return ret_Matrix; } но блин ret_Matrix уничтожается деструктором по return Нужна идея ??? plz |
Сообщ.
#11
,
|
|
|
2Stiff:
успокойся, все нормально с твоим оператором умножения. перед тем как умрет ret_Matrix, он отдается конструктору копирования. создается временный объект (именно он возвращается твоим оператором) а уж после этого вызывается деструктор ret_Matrix'а. Проверь только чтобы у тебя в классе Matrix был конструктор с такой сигнатурой: Matrix(const Matrix &). Тот, который сгенерит комиллятор за тебя тебе скорее всего не подойдет. |
Сообщ.
#12
,
|
|
|
Что -то я не понимаю Конструктор я сделал :
CMatrix(const CMatrix& newMatrix); CMatrix::CMatrix(const CMatrix& newMatrix) { член = newMatrix.член // Образно говоря } но все равно не получается я смотрел отладчиком по return он все равно сначала заходит в деструктор а потом делает return ret_Matrix`а который перед этим в деструкторе удалил и получается что член == 0 |
Сообщ.
#13
,
|
|
|
во-первых, это все-таки конструктор, поэтому пользуйся списком инициализации:
CMatrix(const CMatrix& newMatrix); CMatrix::CMatrix(const CMatrix& newMatrix) : член (newMatrix.член) // Образно говоря { } во-вторых, говоришь смотрел под отладчиком? если смотрел на уровне процессорных команд, то конечно деструктор отработает, до команды ret. ежели конечно смотрел на уровне исходного кода, то, извини, смотрел скорее всего плохо. если проблема останется, шли кусок проекта, посмотрю. PS.А вообще чего вы все к этим матрицам привязались? ты уже 4 или 5 кто за последний месяц при мне тут с ними разбирается. Может имеет смысл найти хорошую реализацию матриц и не мудрить самому? |
Сообщ.
#14
,
|
|
|
2Valery Привязался я к матрицам потому что в универе заставили C++ преподавать студентам которые вообще ничего не знают вот я и думаю чем их озадачить а на счет конструктора сейчас посмотрю ...
|
Сообщ.
#15
,
|
|
|
смотри мыло.
|