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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Класс для работы с дин. матрицей, не пойму почему возникает ошибка 
:(
    Опции темы
heforma
Дата 19.1.2012, 01:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Здравствуйте у меня проблема с динамикой
Код

#include <iostream>
#include <malloc.h>
using namespace std;
#define SYM 0
class Matrix{
    int **mtx;
    int col;
    int row;
    static int existingObj;
    static int createdObj;
private:
    void freeMem();
    void newMem(int row,int col);
    void fillMtx(int i);
    void cpyMtx(int **pttr);
public:
    static int getExistingObj(); //Метод полученя количестава существующих объектов
    static int getCreatedObj(); //Метод получения количества созданых объектов

    Matrix(); //Конструктор
    Matrix(const Matrix& obj); //Конструктор копирования
    ~Matrix(); //Деструктор
    
    void operator = (Matrix& obj);
    Matrix operator +(Matrix obj); //Оператор сложения матриц
    Matrix operator *(Matrix obj); //Оператор умножения матриц
    Matrix operator %(Matrix obj); //Оператор транспонирования матриц (бин)
    void operator /(Matrix& obj); //Оператор присваивания матриц друг другу
    int operator ()(int row,int col); // получение эллемента
    void operator ()(int row,int col,int elem); // установака эллемента

    void creatMtx(int row,int col,int i);

    int getRow(){
        return row;
    }
    int getCol(){
        return col;
    }
    int **getMtx(){
        return mtx;
    }
};

Matrix::Matrix(){
    existingObj++;
    createdObj++;

    mtx=NULL;
    col=0;
    row=0;
}
Matrix::Matrix(const Matrix& obj){
    newMem(obj.row,obj.col);
    cpyMtx(obj.mtx);
    existingObj++;
    createdObj++;
}
Matrix::~Matrix(){
    freeMem();
    existingObj--;
}

void Matrix::freeMem(){
    if(mtx!=NULL){
        for(int i=0;i<row;i++){
            delete []mtx[i];
        }
        delete []mtx;
    }
}
void Matrix::newMem(int row,int col){
    this->row=row;
    this->col=col;
    mtx=new int* [row];
    for(int i=0;i<row;i++){
        mtx[i]=new int [col];
    }
}
void Matrix::fillMtx(int n){
    for(int i=0;i<row;i++){
        for(int j=0;j<col;j++){
            mtx[i][j]=n;
        }
    }
}
void Matrix::cpyMtx(int **pttr){
    for(int i=0;i<row;i++){
        for(int j=0;j<col;j++){
            mtx[i][j]=pttr[i][j];
        }
    }
}

int Matrix::getExistingObj(){
    return existingObj;
}
int Matrix::getCreatedObj(){
    return createdObj;
}

void Matrix::operator = (Matrix& obj){
    freeMem();
    row=obj.row;
    col=obj.col;
    newMem(row,col);
    cpyMtx(obj.mtx);
}
Matrix Matrix::operator+(Matrix obj){
    Matrix temp;
    temp.row=row+obj.row;
    temp.col=col+obj.col;
    temp.newMem(temp.row,temp.col);
    temp.fillMtx(SYM);
    return temp;
}
Matrix Matrix::operator*(Matrix obj){
    Matrix temp;
    temp.row=row*obj.row;
    temp.col=col*obj.col;
    temp.newMem(temp.row,temp.col);
    temp.fillMtx(SYM);
    return temp;
}
Matrix Matrix::operator%(Matrix obj){
    return obj;
}
void Matrix::operator/(Matrix& obj){//<==============| Проблемма
    Matrix temp=obj;
    obj.freeMem();
    obj.newMem(row,col);
    obj.cpyMtx(mtx);

    freeMem();
    newMem(obj.row,obj.col);
    cpyMtx(obj.mtx);
}
int Matrix::operator () (int row,int col){// Получение эллемента
    return mtx[row][col];
}
void Matrix::operator () (int row,int col,int elem){// Установака эллемента
    mtx[row][col]=elem;
}
void Matrix::creatMtx(int row,int col,int n){
    newMem(row,col);
    fillMtx(n);
}

int Matrix::existingObj=0;
int Matrix::createdObj=0;

void main(){
    Matrix obj1;
    Matrix obj2;
    Matrix obj3;

    obj1.creatMtx(5,5,1);
    obj2.creatMtx(10,10,0);

    int **pttr1;
    int **pttr2;
    int **pttr3;

    obj3=obj1+obj2;
    //Matrix obj3=obj1*obj2;

    pttr1=obj1.getMtx();
    pttr2=obj2.getMtx();
    pttr3=obj3.getMtx();

    obj1/obj2;

    for(int i=0;i<obj1.getRow();i++){
        for(int j=0;j<obj1.getCol();j++){
            cout<<pttr1[i][j];
        }
        cout<<endl;
    }

    for(int i=0;i<obj2.getRow();i++){
        for(int j=0;j<obj2.getCol();j++){
            cout<<pttr2[i][j];
        }
        cout<<endl;
    }

}
//existing objects - сущиствующие объекты
//created objects - созданные объекты

 помогите пожалуйста
PM MAIL   Вверх
hawk3500
Дата 19.1.2012, 08:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Поподробней опишите.
Какая ошибка?
Когда возникает?
И в чём вообще вопрос?
--------------------
воин dzen'a
PM MAIL   Вверх
bsa
Дата 19.1.2012, 10:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

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



heforma, если хорошенько подумать, что должен делать оператор деление? Неужели он не должен возвращать результат?!?

Чтобы не допускать подобных ошибок НИКОГДА НЕ ОПРЕДЕЛЯЙ ОПЕРАТОРЫ С ДВУМЯ ПАРАМЕТРАМИ КАК МЕТОДЫ. Их следует реализовывать в виде отдельных функций, который вызывают аналогичные операторы с присваиванием:
Код
Matrix operator/(const Maxtrix &m1, const Matrix &m2)
{
   Matrix ret = m1;
   ret /= m2;
   return ret;
}
А вот оператор /= (и аналогичные) должны быть методами следующего вида:
Код
class Maxtrix
{
   ...
   Matrix& operator/=(const Matrix &m) {
       ...
       return *this;
   }
   ...
};
И обрати особое внимание на использование const.
Все операторы должны что-то возвращать. У тебя же некоторые этого не делают. В частности, присваивание. А должно возвращать неконстантную ссылку на текущую матрицу

Чтобы можно было написать matrix(r,c) = a; необходимо сделать два метода:
Код
int& operator()(int row, int col);
int operator()(int row, int col) const;
Компилятор сам выберет подходящий. Если невозможно выбрать, то он выдаст ошибку.

Судя по всему, ты делаешь класс-матрицу. Поэтому возникает ряд вопросов:
1. что такое "деление" в применении к матрицам?
2. что такое "остаток от деления" в применении к матрицам?
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0427 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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