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

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

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

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

08.11.2011, 23:38. Просмотров 586. Ответов 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     Метод не хочет возвращать объект типа класса которому он принадлежит
Посмотрите здесь:

Почему не хочет возвращать main() ? - C++
Вот практикуюсь в C++, а тут return main(); не хочет работать - красным main() подчёркивает. Почему здесь ошибка, подскажите пожалуйста. ...

Статические функции: добавления указателя (типа AbstractClass) на объект данного класса - C++
Здравствуйте! Не так давно начал изучать C++, препод дал такое задание: Часть 1. Разработка абстрактного класса. .... Часть 2....

Как передавать значения строкового типа в конструктор через объект класса? - C++
Как передавать значения строкового типа в конструктор через объект класса? Или просто, как передавать знач строкового типа в конструктор? ...

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

Создайте класс employee, который содержит имя (объект класса string) и номер (типа long) служащего - C++
Создайте класс employee, который содержит имя (объект класса string) и но- мер (типа long) служащего. Включите в него метод getdata(),...

За данным номером года нашей эры, определить номер века к которому он принадлежит - C++
Прошу помочь! Условие: За данным номером года нашей эры, определить номер века к которому он принадлежит.

Почему перегруженный оператор = должен возвращать ссылку на объект - C++
Объясните доступно пожалуйста. Почему перегруженный оператор= должен возвращать ссылку на объект? А оператор+ может возвращать как...

Что возвращать из vector-a указателей, если объект не найден? - C++
Все добра! Подскажите что возвращать если элемент не найден ? class A { public: A(int val) { a = val; } int a; };

Когда нужно/не нужно возвращать объект при перегрузке присваивания? - C++
Доброго времени суток! Перегрузка присваивания: class alpha { private: int data; public: alpha() // конструктор без...

Не хочет затолкнуть объект в List - C++
У меня есть класс TSettings. Я создал list в котором будут хранится объекты данного класса. Пытаюсь запихнуть в list выдает error: ...


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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
silent_1991
Эксперт С++
4958 / 3034 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
08.11.2011, 23:52     Метод не хочет возвращать объект типа класса которому он принадлежит #2
Jugger, конструктор копии неверно реализован. Не напиши вы даже ненужную matrix u(w), а верни сразу w, проблема бы осталась, ведь при возврате значения всё равно вызовется конструктор копии. А в нём у вас указатель на матрицу в копируемом объекте просто присваивается указателю на матрицу в создаваемом. А в деструкторе вы освобождаете память, выделенную под матрицу. Таким образом, одна и та же память удаляется не один раз, а столько, сколько копий было создано для конкретной матрицы. Вам в конструкторе копии надо выделять новую память под матрицу и поэлементно переносить туда данные из копируемой.
BRcr
4006 / 2295 / 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
Эксперт С++
4958 / 3034 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
09.11.2011, 00:02     Метод не хочет возвращать объект типа класса которому он принадлежит #4
Цитата Сообщение от BRcr Посмотреть сообщение
тут вы пытаетесь получить доступ к секции private объекта cpy, что не есть хорошо...
И почему же это не есть хорошо? Доступ к приват-секции пытается получить класс. Если даже классу это запрещать, то кому разрешать?


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

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

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

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

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