Форум программистов, компьютерный форум CyberForum.ru

Метод не хочет возвращать объект типа класса которому он принадлежит - C++

Восстановить пароль Регистрация
 
Jugger
0 / 0 / 0
Регистрация: 03.09.2008
Сообщений: 35
08.11.2011, 23:38     Метод не хочет возвращать объект типа класса которому он принадлежит #1
Есть класс matrix и один из методов этого класса plus который возвращает объект типа matrix
Но корректно этого делать не хочет
Ошибка возникает на строчке самого возвращения
Сначала пробовал возвращать не используя конструктор копирования, давало ту же ошибку после окончания работы метода plus но до начала вызова следующего метода из main


Код
class matrix{
public:
	matrix() : a(0) {}; // Initialize a = NULL
	matrix(int);
	matrix(int, int);
	matrix(const matrix&);
	~matrix();
	matrix plus(matrix&,matrix&);
	matrix minus(matrix&,matrix&);
	matrix umn1(matrix&,int);
	matrix umn2(matrix&,matrix&);
	void printErr();
	
	double val(int,int);
	void putx(int,int, double);
	void out();
	void random_matrix();
    int N();
	int M();
	
	

	
	
private:
    double * a;
	int n,m,e;

};

..

matrix::matrix(const matrix& cpy){
	n=cpy.n;
	m=cpy.m;
	a=cpy.a;
}

..

matrix matrix::plus(matrix &a,matrix &b){
	matrix w(a.N(),a.M());
	if(a.n!=b.n||a.m!=b.m) e=5;
	else
	
	for(int i=0;i<a.N();i++)
		for(int j=0;j<a.M();j++)
			w.putx(i,j,a.val(i,j)+b.val(i,j));
	
	
    matrix u(w);
     return u;
}

..

int main()
{
	matrix a(10);
	matrix b(10);
	matrix c(10);
	a.random_matrix();
	b.random_matrix();
	a.out();
	c=c.plus(a,b);
	c.out();
	c=c.minus(a,b);
	c.out();
	c=c.umn1(a,15);
	c.out();
	c=c.umn2(a,b);
	c.out();
	c.printErr();
	
	system("pause");
    

    return 0;
}
Скрин ошибки
http://img854.imageshack.us/img854/4060/44965406.png



Как это сделать ?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.11.2011, 23:38     Метод не хочет возвращать объект типа класса которому он принадлежит
Посмотрите здесь:

при вызове конструктора присваивания надо возвращать ссыль на объект или сам объект. Смысл? Значения нужных полей меняютмся и без этого! C++
C++ Почему перегруженный оператор = должен возвращать ссылку на объект
C++ За данным номером года нашей эры, определить номер века к которому он принадлежит
C++ Почему не хочет возвращать main() ?
C++ Создайте класс employee, который содержит имя (объект класса string) и номер (типа long) служащего
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
08.11.2011, 23:52     Метод не хочет возвращать объект типа класса которому он принадлежит #2
Jugger, конструктор копии неверно реализован. Не напиши вы даже ненужную matrix u(w), а верни сразу w, проблема бы осталась, ведь при возврате значения всё равно вызовется конструктор копии. А в нём у вас указатель на матрицу в копируемом объекте просто присваивается указателю на матрицу в создаваемом. А в деструкторе вы освобождаете память, выделенную под матрицу. Таким образом, одна и та же память удаляется не один раз, а столько, сколько копий было создано для конкретной матрицы. Вам в конструкторе копии надо выделять новую память под матрицу и поэлементно переносить туда данные из копируемой.
BRcr
 Аватар для BRcr
4003 / 2292 / 155
Регистрация: 03.02.2011
Сообщений: 5,064
Записей в блоге: 10
08.11.2011, 23:56     Метод не хочет возвращать объект типа класса которому он принадлежит #3
C++
1
2
3
4
5
matrix::matrix(const matrix& cpy){
        n=cpy.n;
        m=cpy.m;
        a=cpy.a;
}
тут вы пытаетесь получить доступ к секции private объекта cpy, что не есть хорошо...
C++
1
if(a.n!=b.n||a.m!=b.m)
опять...

возвращать надо не объект, а указатель на него:
C++
1
return &u;
соответственно и функция должна быть объявлена и определена:
C++
1
matrix& matrix::plus(matrix &a,matrix &b)
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
09.11.2011, 00:02     Метод не хочет возвращать объект типа класса которому он принадлежит #4
Цитата Сообщение от BRcr Посмотреть сообщение
тут вы пытаетесь получить доступ к секции private объекта cpy, что не есть хорошо...
И почему же это не есть хорошо? Доступ к приват-секции пытается получить класс. Если даже классу это запрещать, то кому разрешать?


Цитата Сообщение от BRcr Посмотреть сообщение
возвращать надо не объект, а указатель на него:
Ага, супер. Вы возвращаете адрес объекта, который по выходе из функции перестанет существовать.

Цитата Сообщение от BRcr Посмотреть сообщение
соответственно и функция должна быть объявлена и определена:
А тут в прототипе возвращаете не указатель, а ссылку.

Метод сложения должен возвращать временный объект - результат сложения. Поэтому всё там правильно, за исключением того, о чём я написал выше.

Добавлено через 1 минуту
А, это вы вообще конструктору хотели запретить к приват-секции обращаться?
Yandex
Объявления
09.11.2011, 00:02     Метод не хочет возвращать объект типа класса которому он принадлежит
Ответ Создать тему
Опции темы

Текущее время: 23:27. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru