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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Jugger
0 / 0 / 0
Регистрация: 03.09.2008
Сообщений: 35
#1

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

08.11.2011, 23:38. Просмотров 569. Ответов 3
Метки нет (Все метки)

Есть класс 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++ Не хочет затолкнуть объект в List
Узнать к какому классу принадлежит объект C++
C++ Почему не хочет возвращать main() ?
C++ В некоторый момент программы нужно узнать, к какому классу принадлежит объект
Как передавать значения строкового типа в конструктор через объект класса? C++
C++ Статические функции: добавления указателя (типа AbstractClass) на объект данного класса
C++ Компилятор не хочет создавать экземпляр класса
Научить метод принимать в качестве аргумента объект своего класса и дочерних классов C++
C++ Что возвращать из vector-a указателей, если объект не найден?
как сделать чтобы объект производного класса сам себя добавлял в список или массив указателей базового класса? C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
silent_1991
Эксперт C++
4949 / 3025 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
08.11.2011, 23:52     Метод не хочет возвращать объект типа класса которому он принадлежит #2
Jugger, конструктор копии неверно реализован. Не напиши вы даже ненужную matrix u(w), а верни сразу w, проблема бы осталась, ведь при возврате значения всё равно вызовется конструктор копии. А в нём у вас указатель на матрицу в копируемом объекте просто присваивается указателю на матрицу в создаваемом. А в деструкторе вы освобождаете память, выделенную под матрицу. Таким образом, одна и та же память удаляется не один раз, а столько, сколько копий было создано для конкретной матрицы. Вам в конструкторе копии надо выделять новую память под матрицу и поэлементно переносить туда данные из копируемой.
BRcr
 Аватар для BRcr
4004 / 2293 / 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++
4949 / 3025 / 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     Метод не хочет возвращать объект типа класса которому он принадлежит
Ответ Создать тему
Опции темы

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