Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 11.10.2013, 00:46   #1
proef
Форумчанин
 
Регистрация: 08.06.2013
Сообщений: 133
По умолчанию с++ перегрузка операторов

Создать класс матрицу
как сделать operator+ для матрицы ?
так нужно сделать ещё operator[](int)
как его сделать?
Код:
// ConsoleApplication68.cpp: определяет точку входа для консольного приложения.
//


#include "stdafx.h"
#include <iostream>

class Matrix
{protected:
  float **InitMatrix;
   int ISizeOfMatrix;
   int JSizeOfMatrix;
public:
	 Matrix(int SizeI ,int  SizeJ)
{       ISizeOfMatrix = SizeI;
	    JSizeOfMatrix = SizeJ;
           InitMatrix = new float*[ISizeOfMatrix];
		for (int Number = 0;Number<ISizeOfMatrix;Number++)
		{
			InitMatrix[Number] = new float[JSizeOfMatrix];
		}}

     float** operator+(Matrix &Element)
	{
		float **IntroDuctoryMatrix;
		IntroDuctoryMatrix = new float*[Element.ISizeOfMatrix];
		
		for (int Number = 0;Number<Element.ISizeOfMatrix;Number++)
        {IntroDuctoryMatrix[Number] = new float[Element.JSizeOfMatrix];
		
		}

   for (int NumberI = 0;NumberI<Element.ISizeOfMatrix;NumberI++){  
   for (int NumberJ = 0;NumberJ<Element.JSizeOfMatrix;NumberJ++){
IntroDuctoryMatrix[NumberI,NumberJ] = 
	InitMatrix[NumberI,NumberJ] + Element[NumberI,NumberJ]; 
			
			}
   }
	return IntroDuctoryMatrix;
	}

};

int main(int argc, _TCHAR* argv[])
{
	Matrix a(5,5);
...
...
	return 0;
}
proef вне форума Ответить с цитированием
Старый 11.10.2013, 04:51   #2
rrrFer
Санитар
Старожил
 
Аватар для rrrFer
 
Регистрация: 04.10.2008
Сообщений: 2,577
По умолчанию

Цитата:
как сделать operator+ для матрицы ?
Код:
float** operator+(Matrix &Element)
я думаю, этот оператор должен возвращать this;

Цитата:
так нужно сделать ещё operator[](int)
так не работает?:
Код:
float* operator[](int i) { return InitMatrix[i]; }

Последний раз редактировалось rrrFer; 11.10.2013 в 04:58.
rrrFer вне форума Ответить с цитированием
Старый 11.10.2013, 13:57   #3
valeologiya
Пользователь
 
Регистрация: 07.07.2009
Сообщений: 37
По умолчанию

Дружище, держи медвежью услугу и не привыкай к халяве:

Код:

// ConsoleApplication68.cpp: определяет точку входа для консольного приложения.
//


//#include "stdafx.h"
#include <iostream>
#include <conio.h>
#include <stdlib.h>
using namespace std;

class Matrix
{protected:
  float **InitMatrix;
   int ISizeOfMatrix;
   int JSizeOfMatrix;
public:
     Matrix(int SizeI ,int  SizeJ)
     {
        ISizeOfMatrix = SizeI;
        JSizeOfMatrix = SizeJ;
        InitMatrix = new float*[ISizeOfMatrix];
        for (int Number = 0;Number<ISizeOfMatrix;Number++)
        {
            InitMatrix[Number] = new float[JSizeOfMatrix];
        }
        for (int NumberI = 0;NumberI<ISizeOfMatrix; NumberI++){
            for (int NumberJ = 0;NumberJ<JSizeOfMatrix; NumberJ++){
                InitMatrix[NumberI][NumberJ] = rand()%256 - 128;
            }
        }
     }

     void print(){
         for (int NumberI = 0;NumberI<ISizeOfMatrix; NumberI++){
             for (int NumberJ = 0;NumberJ<JSizeOfMatrix; NumberJ++){
                 cout << InitMatrix[NumberI][NumberJ] << " ";
             }
             cout << endl;
         }
     }

     Matrix operator+(Matrix &Element)
     {
         if((this->ISizeOfMatrix != Element.ISizeOfMatrix) ||
            (this->JSizeOfMatrix != Element.JSizeOfMatrix)){
             cout << "Different sizes" << endl;
             return *this;
         }
         Matrix Result(this->ISizeOfMatrix, this->JSizeOfMatrix);
         for (int NumberI = 0;NumberI<this->ISizeOfMatrix; NumberI++){
             for (int NumberJ = 0;NumberJ<this->JSizeOfMatrix;NumberJ++){
                 Result.InitMatrix[NumberI][NumberJ] =
                     this->InitMatrix[NumberI][NumberJ] + Element.InitMatrix[NumberI][NumberJ];
             }
         }
         return Result;
     }
};

int main(int argc, char* argv[])
{
    Matrix a(5,5);
    cout << "Matrix a: " << endl;
    a.print();
    Matrix b(5,5);
    cout << "Matrix b: " << endl;
    b.print();
    cout << "Matrix a+b: " << endl;
    (a + b).print();
//...
//...
    return 0;
}
valeologiya вне форума Ответить с цитированием
Старый 11.10.2013, 14:10   #4
valeologiya
Пользователь
 
Регистрация: 07.07.2009
Сообщений: 37
По умолчанию

Твое задание с оператором =
Код:

// ConsoleApplication68.cpp: определяет точку входа для консольного приложения.
//


//#include "stdafx.h"
#include <iostream>
#include <conio.h>
#include <stdlib.h>
using namespace std;

class Matrix
{protected:
  float **InitMatrix;
   int ISizeOfMatrix;
   int JSizeOfMatrix;
public:
     Matrix(int SizeI ,int  SizeJ)
     {
        ISizeOfMatrix = SizeI;
        JSizeOfMatrix = SizeJ;
        InitMatrix = new float*[ISizeOfMatrix];
        for (int Number = 0;Number<ISizeOfMatrix;Number++)
        {
            InitMatrix[Number] = new float[JSizeOfMatrix];
        }
        for (int NumberI = 0;NumberI<ISizeOfMatrix; NumberI++){
            for (int NumberJ = 0;NumberJ<JSizeOfMatrix; NumberJ++){
                InitMatrix[NumberI][NumberJ] = rand()%256 - 128;
            }
        }
     }

     void print(){
         for (int NumberI = 0;NumberI<ISizeOfMatrix; NumberI++){
             for (int NumberJ = 0;NumberJ<JSizeOfMatrix; NumberJ++){
                 cout << InitMatrix[NumberI][NumberJ] << " ";
             }
             cout << endl;
         }
     }

     Matrix operator+(Matrix &Element)
     {
         if((this->ISizeOfMatrix != Element.ISizeOfMatrix) ||
            (this->JSizeOfMatrix != Element.JSizeOfMatrix)){
             cout << "Different sizes" << endl;
             return *this;
         }
         Matrix Result(this->ISizeOfMatrix, this->JSizeOfMatrix);
         for (int NumberI = 0;NumberI<this->ISizeOfMatrix; NumberI++){
             for (int NumberJ = 0;NumberJ<this->JSizeOfMatrix;NumberJ++){
                 Result.InitMatrix[NumberI][NumberJ] =
                     this->InitMatrix[NumberI][NumberJ] + Element.InitMatrix[NumberI][NumberJ];
             }
         }
         return Result;
     }

     Matrix& operator=(Matrix &Element)
     {
         if((this->ISizeOfMatrix != Element.ISizeOfMatrix) ||
            (this->JSizeOfMatrix != Element.JSizeOfMatrix)){
             cout << "Different sizes" << endl;
             return *this;
         }
//         Matrix Result(this->ISizeOfMatrix, this->JSizeOfMatrix);
         for (int NumberI = 0;NumberI<this->ISizeOfMatrix; NumberI++){
             for (int NumberJ = 0;NumberJ<this->JSizeOfMatrix;NumberJ++){
                 this->InitMatrix[NumberI][NumberJ] = Element.InitMatrix[NumberI][NumberJ];
             }
         }
         return *this;
     }
};

int main(int argc, char* argv[])
{
    Matrix a(5,5);
    cout << "Matrix a: " << endl;
    a.print();
    Matrix b(5,5);
    cout << "Matrix b: " << endl;
    b.print();
    cout << "Matrix a+b: " << endl;
    (a + b).print();
    a = b;
    cout << "Matrix a=: " << endl;
    a.print();
    Matrix c(5,5);
    c = a = b;
    cout << "Matrix c = a = b: " << endl;
    c.print();
//...
//...
    return 0;
}
valeologiya вне форума Ответить с цитированием
Старый 11.10.2013, 21:32   #5
valeologiya
Пользователь
 
Регистрация: 07.07.2009
Сообщений: 37
По умолчанию

Чутка переделал программу, перегрузив оператор <<. Стало все совсем в духе С++
Код:

// ConsoleApplication68.cpp: определяет точку входа для консольного приложения.
//


//#include "stdafx.h"
#include <iostream>
#include <conio.h>
#include <stdlib.h>
using namespace std;

class Matrix
{
protected:
  float **InitMatrix;
   int ISizeOfMatrix;
   int JSizeOfMatrix;
public:
     Matrix(int SizeI ,int  SizeJ)
     {
        ISizeOfMatrix = SizeI;
        JSizeOfMatrix = SizeJ;
        InitMatrix = new float*[ISizeOfMatrix];
        for (int Number = 0;Number<ISizeOfMatrix;Number++)
        {
            InitMatrix[Number] = new float[JSizeOfMatrix];
        }
        for (int NumberI = 0;NumberI<ISizeOfMatrix; NumberI++){
            for (int NumberJ = 0;NumberJ<JSizeOfMatrix; NumberJ++){
                InitMatrix[NumberI][NumberJ] = rand()%256 - 128;
            }
        }
     }

     Matrix operator+(Matrix &Element)
     {
         if((this->ISizeOfMatrix != Element.ISizeOfMatrix) ||
            (this->JSizeOfMatrix != Element.JSizeOfMatrix)){
             cout << "Different sizes" << endl;
             return *this;
         }
         Matrix Result(this->ISizeOfMatrix, this->JSizeOfMatrix);
         for (int NumberI = 0;NumberI<this->ISizeOfMatrix; NumberI++){
             for (int NumberJ = 0;NumberJ<this->JSizeOfMatrix;NumberJ++){
                 Result.InitMatrix[NumberI][NumberJ] =
                     this->InitMatrix[NumberI][NumberJ] + Element.InitMatrix[NumberI][NumberJ];
             }
         }
         return Result;
     }

     Matrix& operator=(Matrix &Element)
     {
         if((this->ISizeOfMatrix != Element.ISizeOfMatrix) ||
            (this->JSizeOfMatrix != Element.JSizeOfMatrix)){
             cout << "Different sizes" << endl;
             return *this;
         }
//         Matrix Result(this->ISizeOfMatrix, this->JSizeOfMatrix);
         for (int NumberI = 0;NumberI<this->ISizeOfMatrix; NumberI++){
             for (int NumberJ = 0;NumberJ<this->JSizeOfMatrix;NumberJ++){
                 this->InitMatrix[NumberI][NumberJ] = Element.InitMatrix[NumberI][NumberJ];
             }
         }
         return *this;
     }

    friend ostream &operator<<(ostream &stream, Matrix a);
};

ostream &operator<<(ostream &stream, Matrix a){
    for (int NumberI = 0; NumberI < a.ISizeOfMatrix; NumberI++){
        for (int NumberJ = 0; NumberJ <  a.JSizeOfMatrix; NumberJ++){
            cout <<  a.InitMatrix[NumberI][NumberJ] << " ";
        }
        cout << endl;
    }
}

int main(int argc, char* argv[])
{
    Matrix a(5,5);
    cout << "Matrix a: " << endl << a;
    Matrix b(5,5);
    cout << "Matrix b: " << endl << b;
    cout << "Matrix a+b: " << endl << (a+b);
    cout << "Matrix c = a = b: " << (a = b);
    cout << "Matrix a: " << endl << a;
//...
//...
    return 0;
}
valeologiya вне форума Ответить с цитированием
Старый 11.10.2013, 22:07   #6
Smitt&Wesson
Старожил
 
Аватар для Smitt&Wesson
 
Регистрация: 31.05.2010
Сообщений: 13,543
По умолчанию

Цитата:
Сообщение от rrrFer Посмотреть сообщение
Код:
float** operator+(Matrix &Element)
я думаю, этот оператор должен возвращать this;


так не работает?:
Код:
float* operator[](int i) { return InitMatrix[i]; }
Указатель на указатель? Извращенец. Лучше через это &. По крайней мере, точный адрес можно будет получиь (в случае необходимости).
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder
Smitt&Wesson вне форума Ответить с цитированием
Старый 11.10.2013, 23:15   #7
valeologiya
Пользователь
 
Регистрация: 07.07.2009
Сообщений: 37
По умолчанию

А что это за оператор [] для матрицы?
Если вы хотите использовать а[NumberI,NumberJ], как делал топикстартер, то, насколько я знаю, это невозможно, т.к. [] - бинарный оператор, т.е. при перегрузке получить три параметра он не может.
valeologiya вне форума Ответить с цитированием
Старый 12.10.2013, 06:21   #8
rrrFer
Санитар
Старожил
 
Аватар для rrrFer
 
Регистрация: 04.10.2008
Сообщений: 2,577
По умолчанию

Цитата:
Указатель на указатель? Извращенец. Лучше через это &. По крайней мере, точный адрес можно будет получиь (в случае необходимости).
непонял, поясни, пожалсто. Я возвращаю указатель на строку матрицы. Что не так?
Цитата:
А что это за оператор [] для матрицы?
Если вы хотите использовать а[NumberI,NumberJ], как делал топикстартер, то, насколько я знаю, это невозможно, т.к. [] - бинарный оператор, т.е. при перегрузке получить три параметра он не может.
то, что я выше писал возвращает строку. Применяй следующий оператор [] к строке и получай элемент.
И это нормально.
rrrFer вне форума Ответить с цитированием
Старый 12.10.2013, 17:13   #9
still_alive
Great Code Monkey
Форумчанин
 
Аватар для still_alive
 
Регистрация: 09.08.2007
Сообщений: 533
По умолчанию

Цитата:
Сообщение от valeologiya Посмотреть сообщение
Чутка переделал программу, перегрузив оператор <<. Стало все совсем в духе С++
Ну ты че-то тут перегнул. В духе С++ обычно:
  • не использовать такой убогий хедер conio.h
  • вместо stdlib.h подключать cstdlib
  • не засорять пространство имен
  • не объявлять в неполиморфном классе protected-члены
  • не использовать голые указатели
  • проверять корректность данных
  • не заполнять мусором матрицу в конструкторе
  • объявлять константным все, что можно
  • избегать возможных накладных расходов при присваивании самому себе
  • освобождать выделенную память
still_alive вне форума Ответить с цитированием
Старый 12.10.2013, 18:21   #10
rrrFer
Санитар
Старожил
 
Аватар для rrrFer
 
Регистрация: 04.10.2008
Сообщений: 2,577
По умолчанию

Цитата:
Ну ты че-то тут перегнул. В духе С++ обычно:

не использовать такой убогий хедер conio.h
вместо stdlib.h подключать cstdlib
не засорять пространство имен
не объявлять в неполиморфном классе protected-члены
не использовать голые указатели
проверять корректность данных
не заполнять мусором матрицу в конструкторе
объявлять константным все, что можно
избегать возможных накладных расходов при присваивании самому себе
освобождать выделенную память
Ну это ты че-то перегнул )). Советы все хорошие и относятся к хорошему коду вцелом, а не к плюсам (как будто в Си освобождать выделенную память не надо и засорение пространства имен - признак хорошего тона).
rrrFer вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Перегрузка операторов three_cats Общие вопросы C/C++ 2 24.02.2013 15:07
Перегрузка операторов Leo_ня Общие вопросы C/C++ 7 10.04.2011 15:52
перегрузка операторов mashuta_ya Общие вопросы C/C++ 0 01.10.2010 18:54
Перегрузка операторов (С++) Перчитель Помощь студентам 1 03.12.2008 18:46
Перегрузка операторов, Организация перегрузки операторов chagin_yav Помощь студентам 2 12.05.2008 09:15