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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 27.08.2011, 18:25   #1
Skender
Пользователь
 
Регистрация: 27.08.2011
Сообщений: 21
По умолчанию int &operator []() - Как сделать

Вопрос вот в чем не могу понять как сделать вот такубю задачкуЖ:
Определить оператор [] так, чтобы обращение [][] к элементам имело смысл, аналогичный
встроенному.
объясните пожалуйста.
если кодом то только приветствуеться ))
Skender вне форума Ответить с цитированием
Старый 27.08.2011, 18:47   #2
Ivan_32
somewhere else
Участник клуба
 
Аватар для Ivan_32
 
Регистрация: 17.07.2008
Сообщений: 1,409
По умолчанию

Я как-то сам интересовался данным вопросом и все что нашел было вот это:
2-dimensional subsript operator overload
На мой взгляд это лишняя морока, да и выглядит такое решение просто убого. В любом случае в самом С++ нет средств для перегрузки этого оператора и в С++0x вроде не намечается такая функциональность.
"Тяжело в учении, легко в бою" - А.В. Суворов
Ivan_32 вне форума Ответить с цитированием
Старый 27.08.2011, 19:12   #3
Skender
Пользователь
 
Регистрация: 27.08.2011
Сообщений: 21
По умолчанию

ДА я бы сам в жизни в такой гемморой не сунулся только вот учеба заставляет ((
Skender вне форума Ответить с цитированием
Старый 27.08.2011, 19:20   #4
An1ka
C++,DirectX/OpenGL
Форумчанин
 
Регистрация: 09.01.2011
Сообщений: 422
По умолчанию

Если матрица, то можно представить в виде массива строк:
Код:
 struct sRow2
{
	int row2[2];
	int& operator[] ( size_t i) { return row2[i];}
};
 struct sMat2x2
{
	sRow2 mat2x2[2];
	sRow2& operator[] ( size_t i) { return mat2x2[i];}
};

int main() {
	sMat2x2 matrix = { 1, 2,
			   3, 4};
	std::cout<< matrix[1][1] << std::endl;
        return 0;
}

Последний раз редактировалось An1ka; 27.08.2011 в 19:26.
An1ka вне форума Ответить с цитированием
Старый 27.08.2011, 22:00   #5
onewho
Форумчанин
 
Регистрация: 29.09.2010
Сообщений: 636
По умолчанию

сделать 2 версии operator[]:
1ая возвращается ссылку на T*
2ая возвращается ссылку на T
и всьо.
onewho вне форума Ответить с цитированием
Старый 27.08.2011, 22:23   #6
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
сделать 2 версии operator[]:
интересно, а как отличать то их компиль будет?
параметры то одинаковы, или у операторов и результат является частью сигнатуры?
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 27.08.2011, 23:34   #7
Syuf
Форумчанин
 
Аватар для Syuf
 
Регистрация: 02.02.2010
Сообщений: 599
По умолчанию

ТС: Так пойдет?
Код:
class Matrix
{
private
   int _data[10][10];

public:
   int* operator [] (prtdiff_t pos)
   {
      return _data[pos];
   }
};
"Лишь то читается легко, что написано с трудом; что в час написано, то в час и позабыто."
Syuf вне форума Ответить с цитированием
Старый 28.08.2011, 03:19   #8
onewho
Форумчанин
 
Регистрация: 29.09.2010
Сообщений: 636
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
интересно, а как отличать то их компиль будет?
параметры то одинаковы, или у операторов и результат является частью сигнатуры?
да конечно вы правы...
написал не подумав, что-то ((
onewho вне форума Ответить с цитированием
Старый 28.08.2011, 10:02   #9
Skender
Пользователь
 
Регистрация: 27.08.2011
Сообщений: 21
По умолчанию

А теперь мне поясните как мне все это засунуть в такой кодЖ:
Код:
clas.h

#include <iostream>
using namespace std;
class vector;
class matrix
{
private:
	//The variables
	int **matr;
	int string,column;
	int checkstatus;
	//FRIEND Function
	friend matrix operator+(matrix &str,vector &size);
	friend matrix operator-(matrix &str,vector &size);
	friend matrix operator+=(matrix &str,vector &size);
	friend matrix operator-=(matrix &str,vector &size);
	friend matrix operator*(matrix &str,vector &size);
	friend matrix operator*=(matrix &str,vector &size);
public:
	matrix(int STRING , int COLUMN):string(STRING),column(COLUMN){};
	//Construction and Destruction
	matrix ();
	matrix (int number);
	matrix (matrix &matr1,int number);
	matrix (matrix &matr2);
	~matrix();
	//Function
	int getCount()const{return string;}
	int setCount()const{return column;}
	int get(int i,int j)const{return matr[i][j];}
	//job number
	matrix operator+(float num);
	matrix operator-(float num);
	matrix operator+=(float num);
	matrix operator-=(float num);
	matrix operator*(float num);
	matrix operator*=(float num);
	matrix operator=(const float num);
	//job matrix
	matrix &operator=(const matrix &str);
	matrix operator+(const matrix &str);
	matrix operator-(const matrix &str);
	matrix operator+=(const matrix &str);
	matrix operator-=(const matrix &str);
	matrix operator*=(const matrix &str);
	matrix operator*(const matrix &str);
	int *operator [](int i){return matr[i];}
	
	friend istream& operator >> (istream& CIN, matrix&str);
	friend ostream & operator<<(ostream &COUT,matrix &T);
};
class vector
{
private:
	int *mas;
	int size;
	int chekstatus;
	friend matrix operator+(matrix &str,vector &size);
	friend matrix operator-(matrix &str,vector &size);
	friend matrix operator+=(matrix &str,vector &size);
	friend matrix operator-=(matrix &str, vector &size);
	friend matrix operator*(matrix &str,vector &size);
	friend matrix operator*=(matrix &str,vector &size);
public:
	vector();
	vector(int number);
	vector (vector &mas1,int number);
	vector(vector &mas2);
	~vector(){delete []mas;};
	int getCount()const{return size;}
	vector operator++(int index);
	vector operator --(int index);
	vector operator -(int number);
	int &operator [](int i){return (int)mas[i];}
	vector operator/(const vector &T);
	vector operator/=(const vector &T);
	friend istream & operator >> (istream& CIN, vector&str);
	friend ostream & operator<<(ostream &COUT,vector &mas);
};

Последний раз редактировалось Stilet; 28.08.2011 в 10:41.
Skender вне форума Ответить с цитированием
Старый 28.08.2011, 10:04   #10
Skender
Пользователь
 
Регистрация: 27.08.2011
Сообщений: 21
По умолчанию

classVector.cpp
Код:
#include "class.h"
#include <iostream>
using namespace std;
//Реализация класса vector  
//Construction
vector::vector()
{
	size=1;//присваивание числа элементов 
	mas=new int[size];//выделение памяти под элемент 
	mas[0]=0;//обнуление 
	chekstatus=0;
}
vector::vector(int number)
{
	size=number;//присваение размера вектора 
	mas=new int[size];//выделение под него память 
	for (int i=0;i<size;i++)
		{
			mas[i]=(int)i;//инициализация вектора номером в массиве 	
		}
	chekstatus=0;
}
vector::vector(vector &mas1, int number)
{
	size=number;
	mas=new int[size];//выделение памяти под вектор первым аргументом 
	for (int i=0;i<size;i++)
		{
			mas[i]=mas1.operator [](i);	// инициализация вторым аргументом 
		}
	chekstatus=0;
}
vector::vector(vector &vec)//Конструктор копирования   
{  
	mas = new int[vec.getCount()];  
	for(int i=0;i < vec.getCount();i++)
		{
			mas[i] = vec.operator [](i);
		}
} //the end
//operators
vector vector : : o perator ++(int index)
{
	if (index>=size)
		{
			cout<<"mnogo\n";
			exit(1);
		}
	index++;
	return mas[index];
}
vector vector::operator --(int index)
{
	if (index<=0)
		{
			cout<<"malo\n";
			exit(1);
		}
	index--;
	return mas[index];
}
vector vector::operator -(int number)
{
	for(int i=0;i<getCount();i++)
		{
			mas[i]=mas[i]-number;	
		}
	return *mas;
}
vector vector::operator/(const vector &T)
{
	for(int i=0;i<T.size;i++)
		{
			mas[i]=mas[i]/T.mas[i];	
		}
	return *mas;
}
vector vector::operator/=(const vector &T)
{
	for(int i=0;i<T.size;i++)
		{
			mas[i]/=T.mas[i];	
		}
	return *mas;
}
//the end
istream & operator >> (istream& CIN, vector&str)
{
	CIN>>str.size;
	return CIN;
}
ostream & operator<<(ostream & COUT,vector &T)
{
	for(int i=0;i<T.size;i++)
		{
			COUT<<T.mas[i]<<"\t";	
		}
	COUT<<"____________________________________________"<<endl;
	return COUT;
}
//Конец реализации
TEst.cpp
Код:
#include <iostream>
#include "class.h"
using namespace std;
int main()
{
	//job is matrix;
	int number1;
	float number2;
	cout<<"Please Enter Numbers\n";
	cin>>number1>>number2;
	matrix A;
	matrix B(number1);
	matrix C(B,number1);
	cout<<A;
	cout<<B;
	cout<<C.operator [](number1);
	return 0;
}

Последний раз редактировалось Stilet; 28.08.2011 в 10:43.
Skender вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
функция float average(int arrray[],int from,int to) yuliyayuliya Помощь студентам 0 25.04.2011 21:55
перегрузка & operator+= prc Общие вопросы C/C++ 2 24.03.2011 17:51
ошибка: no match for ‘operator<<’ in ‘std::operator<< [with _Traits = std::char_traits<char> Critter Общие вопросы C/C++ 5 08.08.2010 23:38
Как сделать графическую оболочку& alexov Помощь студентам 3 03.01.2009 15:13
Как сделать так, что-бы при перетаскивании файла драг&дроп-ом на мою форму, он открывался??? Altera Общие вопросы Delphi 2 11.04.2008 15:00