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

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

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

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

08.11.2011, 23:38. Просмотров 597. Ответов 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



Как это сделать ?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.11.2011, 23:38
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Метод не хочет возвращать объект типа класса которому он принадлежит (C++):

Может ли метод класса возвращать экземпляр этого же класса? - C++
такой вопрос, реально что бы функция класса имела тип класса(возвращала класс), то есть типа так: class c1{ c1 f1(); } если да, то...

Как корректно передать в метод шаблонного класса объект шаблонного класса в качестве параметра? - C++
header.h template &lt;class T&gt; class MyVector { public: void swap(MyVector&lt;T&gt;Vector); } template &lt;class T&gt; void...

при вызове конструктора присваивания надо возвращать ссыль на объект или сам объект. Смысл? Значения нужных полей меняютмся и без этого! - C++
Друзья! Обнаружил пробел в знаниях. Собсно, вопрос в теме. Дополню лишь: поля объекта меняются на нужные значения и безо всякого возврата...

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

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

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

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


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

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

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

Добавлено через 1 минуту
А, это вы вообще конструктору хотели запретить к приват-секции обращаться?
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.11.2011, 00:02
Привет! Вот еще темы с ответами:

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

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

Оптимальные методы поиска треугольника, которому принадлежит заданная точка - C++
Есть прямоугольная область. Она разбита на множество треугольников (100-1000 шт). Есть неотсортированный массив треугольников которые...

Определить поток/процесс, которому принадлежит произвольный адрес оперативной памяти - C++
здравствуйте я использую windows 7 помогите определить поток процесс к которому принадлежит произвольный адрес оперативной памяти например...


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

Или воспользуйтесь поиском по форуму:
4
Yandex
Объявления
09.11.2011, 00:02
Ответ Создать тему
Опции темы

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