Первое:
Если пишите на C++ и используете заголовочные файлы С, их принято называть
ctime
, а не
time.h
Второе:
Для псевдослучайных чисел в C++ используйте заголовочный файл
random:
#include <random>
...
std::random_device rd;
std::cout << rd() % 10;
Третье:
Если вам нужен массив, используйте массив. То что вы написали - очень странный костыль.
Если нужно заполнить массив случайными числами, напишите функцию:
void fill_with_random(int* arr, size_t n)
{
random_device rand;
for (size_t i = 0; i < n; ++i)
{
arr[i] = rand() % 21 - 10;
}
}
Четвёртое:
cout << y[0][0]; //все прекрасно выводится
/*но если попробовать сделать y[0][0]+=1; то выводится ошибка "выражение должно быть допустимым для изменения левосторонним значением"*/
Естественно, так происходит потому, что в вашем классе (который и не нужен совсем) вы возвращаете число, там где ожидается ссылка:
int operator [](int i)
{
return x[i];
}
Заменить на:
int& operator [](int i)
{
return x[i];
}
Пятое:
int operator [](int i)
{
return y[i][0]; /*совершенно непонятно, какую роль здесь играет [0], и почему не работает с просто return y[i]... при изменении [0] на любое другое число, результат не меняется...*/
}
Непонятно потому, что его там и не должно быть. operator[] должен давать доступ к строке (т.е. массиву). А уже второй operator[] будет относится к массиву и возвратит ссылку на элемент.
massiv& operator [](int i)
{
return y[i];
}
Шестое:
Если нужна матрица, используйте двумерный массив и не изобретайте велосипед. Если класс всё же необходим, например, если нужно добавить методы для работы с матрицей, можно написать такой класс, используя двумерный массив:
class Matrix
{
public:
Matrix() {}
int* operator[] (size_t i)
{
return &arr[i][0]; // Указатель на первый элемент i-ой строки.
}
private:
int arr[5][5];
}
Седьмое:
Классы принято называть с большой буквы. И пожалуйста, не называйте их транслитом.
Массив - Array
Матрица - Matrix