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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Перегрузка операций вычитания и смены знака с матр, перегрузка операция вычитания 
V
    Опции темы
astilla
Дата 20.1.2007, 14:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



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

Код

// операция вычитания A-B
Mtrx& Mtrx::operator-(Mtrx& Op2) {
   if ((m != Op2.m) & (n != Op2.n)) {
      cout << "Массивы имет разную размерность" << endl;
      exit(1);
   }
   Mtrx &C = *(new Mtrx (m,n));
   for(int i=0, j; i < m; i++)
     for(j=0; j < n; j++) 
       C.matr[i*m+j] = matr[i*m+j] - Op2.matr[i*m+j];
   return C;
}


то все правильно вычитается, то смена знака не получается
а если такой
Код

// операция вычитания A-B
Mtrx& Mtrx::operator-(Mtrx& Op2) {
   if ((m != Op2.m) & (n != Op2.n)) {
      cout << "Массивы имет разную размерность" << endl;
      exit(1);
   }
   Mtrx &C = *(new Mtrx (m,n));
   for(int i=0, j; i < m; i++)
     for(j=0; j < n; j++) 
       C(i,j)=C(i,j)-Op2(i,j);
   return C;
}

то "автоматически" получается "смена знака"

Как правильно мне написать перегрузку этих операций?
PM MAIL   Вверх
GIK
Дата 20.1.2007, 14:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Добрый человек
**


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

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



Цитата

C(i,j)=C(i,j)-Op2(i,j);

Эт че такое то, через указатель что вызываешь? Кидай полный код.


--------------------
Математика=>пиво=> програмирование, три вещи последовательны и совместимы !!!
Программирование - это не деятельнось! Программирование - это состояние души!
Бог - самый крутой программист.
PM MAIL ICQ   Вверх
Rockie
Дата 20.1.2007, 14:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1143
Регистрация: 23.4.2006

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



Цитата(astilla @  20.1.2007,  14:32 Найти цитируемый пост)
 if ((m != Op2.m) & (n != Op2.n)) {

тут логическое или, как понимаю 
Код

||


это смена знака только для положительных матриц? матрица и так может выглядеть:

1 -2
-3 4

Добавлено @ 14:49 
astilla, если только для положительных матриц, то перегружай оператор -- и вычитай из матрицы
Код

 C.matr[i*m+j] = C.matr[i*m+j]- C.matr[i*m+j]*2;





--------------------
Чтобы иметь большой гардероб - надо иметь большой гардероб.
PM   Вверх
Anikmar
Дата 20.1.2007, 14:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

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



Цитата(astilla @  20.1.2007,  14:32 Найти цитируемый пост)
Никак не могу сообразить, как сделать переграузку операции "смена знака" у матриц

Я бы не парился, оператор- оставил бы для вычитания матриц, а для смены знака добавил бы метод вроде Neg или подобный.

Перегрузка операция предназначена для повышения читабельности программы. Не всегда и не все действия необходимо перегружать. Мне кажется, что вынос отдельного метода для смены знака было бы разумно.


PM MAIL ICQ   Вверх
Sartorius
Дата 20.1.2007, 14:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1568
Регистрация: 18.7.2006
Где: Ivory tower

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



прототип не тот... унарный минус без параметров
Код

class CMy {
public:
    CMy & operator-()
    {
       CMy res(*this);       
        res.m_value *= -1;
        return res;
    }
    int m_value;
};
void main()
{
    CMy myC;
    -myC;

}




Это сообщение отредактировал(а) Sartorius - 20.1.2007, 14:56
PM MAIL ICQ   Вверх
SaDFromSpb
Дата 20.1.2007, 15:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



astilla, 
Если смена знака, о которой ты говоришь, это -m. (То есть просто поменять знак для одного класса). Значт тебе нужна форма operator-() без аргументов.

Код

class A {
public:
    A(int in) : i(in) {};
    
    A operator-(const A& other) {
        return A(i-other.i);
    };
    
    A operator-() {
        return A(-i);
    };
    
    void print() { cout<<"From A : "<<i<<endl; };
private:
   int i;
};



Цитата(astilla @  20.1.2007,  14:32 Найти цитируемый пост)
Mtrx &C = *(new Mtrx (m,n));
Так делать нехорошо. То, что выделилось по этой операции new, ты удалить уже не сможешь. Если нужно генерировать временный объект для далнейшего участия в операциях, следует использовать возвращение значения с размещением на стек.

Добавлено @ 15:19 
Добавлю, что когда я начал писать ответ, последним было сообщение Rockie  smile

Добавлено @ 15:27 
Цитата(Sartorius @  20.1.2007,  14:53 Найти цитируемый пост)
    CMy & operator-()
    {
       CMy res(*this);       
        res.m_value *= -1;
        return res;
    }

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

Это сообщение отредактировал(а) SaDFromSpb - 20.1.2007, 15:30


--------------------
"За исключением части, касающейся потоков, библиотека Loki написана на стандартном языке С++. Увы, это означает, что многие современные компиляторы не смогут работать с ней в полном объеме." (А. Александреску. Modern C++ design. 2001)
PM   Вверх
astilla
Дата 20.1.2007, 15:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



ОГРОМНОЕ все спасибо!
Разобралась. Все получилось.
Спасибо за то, что вы все есть smile
PM MAIL   Вверх
Sartorius
Дата 20.1.2007, 15:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1568
Регистрация: 18.7.2006
Где: Ivory tower

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



Цитата

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

 Ты ошибаешься. Компилятор в этом случае создает копию res.
PM MAIL ICQ   Вверх
SaDFromSpb
Дата 20.1.2007, 15:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(Sartorius @  20.1.2007,  15:43 Найти цитируемый пост)
Ты ошибаешься. Компилятор в этом случае создает копию res. 

Я тоже об этом подумал сначала. Проверл. Мой компилятор (cl из VisualStudio) работает, как я описываю. Да и по семантике он не должен копироваться, если мы ссылку возвращаем.


--------------------
"За исключением части, касающейся потоков, библиотека Loki написана на стандартном языке С++. Увы, это означает, что многие современные компиляторы не смогут работать с ней в полном объеме." (А. Александреску. Modern C++ design. 2001)
PM   Вверх
Axxent
Дата 20.1.2007, 15:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата

 Ты ошибаешься. Компилятор в этом случае создает копию res.

Если это и так, то скорее всего не везде, тем не менее в любом случае путать людей не стоит. Возвращать ссылку или указатель на объект созданный в стеке - не есть хорошо. 
PM MAIL ICQ   Вверх
Sartorius
Дата 20.1.2007, 16:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1568
Регистрация: 18.7.2006
Где: Ivory tower

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



SaDFromSpb, интересно. У мну VS2005 все работает корректно.
PM MAIL ICQ   Вверх
Axxent
Дата 20.1.2007, 16:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Sartorius, 
даже если таким макаром возвращать объекты с динамическим выделением памяти, освобождающие память в деструкторе? Очень-очень не верится.
PM MAIL ICQ   Вверх
SaDFromSpb
Дата 21.1.2007, 16:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(Sartorius @  20.1.2007,  16:11 Найти цитируемый пост)
SaDFromSpb, интересно. У мну VS2005 все работает корректно.

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

Это сообщение отредактировал(а) SaDFromSpb - 21.1.2007, 16:28


--------------------
"За исключением части, касающейся потоков, библиотека Loki написана на стандартном языке С++. Увы, это означает, что многие современные компиляторы не смогут работать с ней в полном объеме." (А. Александреску. Modern C++ design. 2001)
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
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.0566 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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