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

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

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 19.10.2015, 14:31   #1
RAFA91
Заблокирован
 
Регистрация: 06.02.2011
Сообщений: 1,999
По умолчанию operator [][]

Добрый день !
Подскажите пожалуйста почему не работает operator [][]

Код:
#include <iostream>
using namespace std;

class A
{
	
	public:
	int operator [][] (int x,int y)
	{
		return x+y;
	}
};


int main() 
{
	
	A b;
	b[7][4];
	return 0;
}
RAFA91 вне форума Ответить с цитированием
Старый 19.10.2015, 14:43   #2
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Потому что его не существует и бывают только массивы массивов?
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 19.10.2015, 14:52   #3
RAFA91
Заблокирован
 
Регистрация: 06.02.2011
Сообщений: 1,999
По умолчанию

а как тогда правильно написать оператор для b[7][4];
RAFA91 вне форума Ответить с цитированием
Старый 19.10.2015, 14:54   #4
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,706
По умолчанию

Код:
#include <iostream>
using namespace std;

class Astr
{
	int _x;
	
	public:
	Astr() : _x(0) {}
	Astr(int x) : _x(x) {}
	int operator [](std::size_t ind)
	{
		return _x + ind;
	}
};

class A
{
	
	public:
	Astr operator [] (std::size_t ind)
	{
		return Astr(ind);
	}
};


int main() 
{
	
	A b;
	b[7][4];
	return 0;
}
p51x вне форума Ответить с цитированием
Старый 19.10.2015, 16:48   #5
RAFA91
Заблокирован
 
Регистрация: 06.02.2011
Сообщений: 1,999
По умолчанию

а как к примеру при выполнении

b[0][0]; вернуть a[0][0]; class A?

Код:
#include <iostream>
using namespace std;

class Astr
{
	int _x;
	
	public:
	Astr() : _x(0) {cout<<"Конструктор Astr 1"<<endl;}
	Astr(int x) : _x(x) {cout<<"Конструктор Astr 2"<<endl;}
	~Astr()  {cout<<"Деструктор Astr "<<endl;}
	int operator [](std::size_t ind)
	{
		cout<<"operator [] Astr ind = "<<ind<<endl;
		return _x + ind;
	}
};

class A
{
	int a[2][3];
	public:
	A() {cout<<"Конструктор A"<<endl;}
	~A() {cout<<"Деструктор A"<<endl;}
	Astr operator [] (std::size_t ind)
	{
		cout<<"operator [] A ind = "<<ind<<endl;
		return Astr(ind);
	}
	void func() 
	{
		int i,j;
		for(i=0;i<2;i++)
		for(j=0;j<3;j++)
		a[i][j]=(i+1)*(j+1);
		
	}
};


int main() 
{
	
	A b;
	b.func();
	
	return 0;
}
RAFA91 вне форума Ответить с цитированием
Старый 19.10.2015, 17:05   #6
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,706
По умолчанию

Хранить не int a[][], а Astr[] и в Astr не int, а int[]
p51x вне форума Ответить с цитированием
Старый 19.10.2015, 17:08   #7
Croessmah
Вредный кошак
Участник клуба
 
Аватар для Croessmah
 
Регистрация: 14.10.2012
Сообщений: 1,159
По умолчанию

Код:
obj[1][2] ;
будет развернуто в вызов операторной функции
Код:
obj.operator[](1)[2];
Соответственно, obj.operator[](1) должно возвращать что-то, к чему можно применить оператор [], например указатель или объект (ссылку на объект), с "перегруженным оператором" [].
Croessmah вне форума Ответить с цитированием
Старый 19.10.2015, 17:15   #8
RAFA91
Заблокирован
 
Регистрация: 06.02.2011
Сообщений: 1,999
По умолчанию

написал так

Код:
#include <iostream>
using namespace std;

class A;

class Astr
{
	int _x;
	A *_p;
	
	public:
	Astr() : _x(0) {cout<<"Конструктор Astr 1"<<endl;}
	Astr(int x, A *p) : _x(x),_p(p) {cout<<"Конструктор Astr 2"<<endl;}
	~Astr()  {cout<<"Деструктор Astr "<<endl;}
	int operator [](std::size_t ind)
	{
		cout<<"operator [] Astr ind = "<<ind<<endl;
	
		return _p->a[_x][ind];
	}
};

class A
{
	public:
	int a[2][3];
	A() {cout<<"Конструктор A"<<endl;}
	~A() {cout<<"Деструктор A"<<endl;}
	Astr operator [] (std::size_t ind)
	{
		cout<<"operator [] A ind = "<<ind<<endl;
		return Astr(ind,this);
	}
	void func() 
	{
		int i,j;
		for(i=0;i<2;i++)
		for(j=0;j<3;j++)
		a[i][j]=(i+1)*(j+1);
		
	}
};

int main() 
{
	
	A b;
	b.func();

	
	return 0;
}
но при выполнении return _p->a[_x][ind]; получаю ошибку.

скорее всего из-за неверного размещения классов
RAFA91 вне форума Ответить с цитированием
Старый 19.10.2015, 17:21   #9
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,706
По умолчанию

А зачем такая муть, если у вас массив в паблике?

Вот вам еще вариант:
Код:
сlass Matrix {
public:
    class Row {
        friend class Matrix;
    public:
        int& operator[](int col)
        {
            return parent.arr[row][col];
        }
    private:
        Row(Matrix &parent_, int row_) : 
            parent(parent_),
            row(row_)
        {}

        CMatrix& parent;
        int row;
    };

    Row operator[](int row)
    {
        return Row(*this, row);
    }
private:
    int rows, cols;
    int **arr;
};
p51x вне форума Ответить с цитированием
Старый 19.10.2015, 17:36   #10
RAFA91
Заблокирован
 
Регистрация: 06.02.2011
Сообщений: 1,999
По умолчанию

p51x я подумал про это
Цитата:
Сообщение от p51x Посмотреть сообщение
Хранить не int a[][], а Astr[] и в Astr не int, а int[]

Код:
#include <iostream>
using namespace std;

class A;

class Astr
{
	int _x[3];
	public:
	Astr()  {cout<<"Конструктор Astr 1"<<endl;}
	
	~Astr()  {cout<<"Деструктор Astr "<<endl;}
	int operator [](std::size_t ind)
	{
		cout<<"operator [] Astr ind = "<<ind<<endl;
	
		return _x[ind];
	}
	void func() 
	{
		for(int i=0;i<3;i++) _x[i]=i+1;
	}
};

class A
{
	public:
	Astr a[2];
	A() {cout<<"Конструктор A"<<endl;}
	~A() {cout<<"Деструктор A"<<endl;}
	Astr operator [] (std::size_t ind)
	{
		cout<<"operator [] A ind = "<<ind<<endl;
		return a[ind];
	}
	void func() 
	{
		for(int i=0;i<2;i++) a[i].func();
	}
};

int main() 
{
	
	A b;
	b.func();

	
	return 0;
}
RAFA91 вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
operator += RAFA91 Общие вопросы C/C++ 8 28.07.2015 15:28
operator== 220Volt Общие вопросы C/C++ 3 19.01.2015 17:48
operator char*() + operator[](uint) riden Общие вопросы C/C++ 3 17.02.2013 08:45
ошибка: no match for ‘operator<<’ in ‘std::operator<< [with _Traits = std::char_traits<char> Critter Общие вопросы C/C++ 5 08.08.2010 23:38
operator() в С++ Andrey995 Помощь студентам 4 01.08.2010 03:26