Задать вопрос
@NikHaker
/

Как изменять значения переменных другого класса в C++?

В общем задача такова, есть 2 класса: класс массив и класс матрица. Класс массив - это класс, полем которого является одномерный массив, а класс матрица - класс, полем которого является одномерный массив обьектов типа массив. таким образом в классе матрица у нас поле будет двумерный массив. У меня возникла проблема, что я не могу менять значения элементов двумерного массива в классе матрица. Вот исходный код:
#include <iostream>
#include <time.h>
#include <iomanip>

using namespace std;

class matrica;

class massiv
{
public:
	int x[5];
	massiv(){
		for (int i = 0; i < 5; i++){
			x[i] = rand() % 21 - 10;
			cout << setw(4) << x[i];
		}
		cout << endl;
	}

	int  operator [](int i)
	{
		return x[i];
	}
	friend matrica;
};



class matrica
{
	
public:
	massiv y[5];
	matrica(){
		cout << y[0][0];//все прекрасно выводится
                /*но если попробовать сделать y[0][0]+=1; то выводится ошибка "выражение должно быть допустимым для изменения левосторонним значением"*/
	}

	int  operator [](int i)
	{
		return y[i][0]; /*совершенно непонятно, какую роль здесь играет [0], и почему не работает с просто return y[i]... при изменении [0] на любое другое число, результат не меняется...*/
	}
};

void main(){
	srand(time(NULL));
	matrica example;
	system("pause");
}

как можно изменять значения конкретного элемента этого двумерного массива из класса matrica? Заполнять я его хотел тоже из класса матрица
  • Вопрос задан
  • 4179 просмотров
Подписаться 1 Оценить Комментировать
Решения вопроса 3
@Alexander1705
Первое:
Если пишите на 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
Ответ написан
Комментировать
@Mercury13
Программист на «си с крестами» и не только
Не буду говорить о качестве кода, const-корректности и прочей бяке. Конкретная ваша ошибка
int& operator [](int i) // именно ссылка!

У вас возвращается значение — временный объект, которому, разумеется, невозможно присвоить что бы то ни было.
Ответ написан
AtomKrieg
@AtomKrieg
Давай я поищу в Google за тебя
Оператор должен возвращать ссылку
int& operator [](int i)
{
return x[i];
}
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы