Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 29.11.2010, 23:20   #1
Chica Bond
Пользователь
 
Регистрация: 15.03.2010
Сообщений: 31
Печаль функция не возвращает результат=(

Добрый вечер. у меня такая проблема. мне нужно перегрузить функцию для моего класса:

Код:
numb numb::operator +(const numb &p)const
{
        numb res;
        res.add(4);
        return res;
}
но эта функция не возвращает результат. я понимаю, что это локальная переменная, но не очень разбираюсь со всем этим... пробывала объявлять res как глобальную и как статическую, но компилятор всё-равно выдаёт ошибку. работат только в том случае если убрать деструктор, но он мне нужен... вот уже и не знаю что делать. помогите пжлс) заранее спасибо!))

Последний раз редактировалось Chica Bond; 29.11.2010 в 23:24.
Chica Bond вне форума Ответить с цитированием
Старый 30.11.2010, 07:53   #2
X-Zef
 
Аватар для X-Zef
 
Регистрация: 29.11.2010
Сообщений: 7
По умолчанию

Как я понял res - это не переменная а экземпляр класса - numb. И если можно полностью выложи объявление класса.
X-Zef вне форума Ответить с цитированием
Старый 30.11.2010, 08:30   #3
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

Код:
numb numb::operator +(const numb &p)const
{
        numb res;
        res.add(4);
        return res;
}
Что за бред? Зачем здесь еще локальная переменная? У вас оператор как вызывается фактически?
p51x вне форума Ответить с цитированием
Старый 30.11.2010, 09:01   #4
c++ learner
Пользователь
 
Регистрация: 19.12.2008
Сообщений: 38
По умолчанию

Я не пойму а зачем тогда р – по ссылке передается в тело если оно не используется, и потом кто вас столько const’ов заставил написать?)
Код:
	object operator+(object &p) 
	{
		object temp;
		temp.x=(x+p.x);
		temp.y=(y+p.y);
		temp.z=(z+p.z);
		return temp;
	}
"...в самом начале было слово.." т.е. 16-битное битовое поле.
c++ learner вне форума Ответить с цитированием
Старый 30.11.2010, 10:13   #5
Гром
Старожил
 
Аватар для Гром
 
Регистрация: 21.03.2009
Сообщений: 2,193
По умолчанию

Покажите-ка остальной код. Как мне кажется, все должно работать нормально, если с конструктором копирования и operator= все в порядке. Разве что строка
Код:
res.add(4);
только для отладки годится, а в реальности надо использовать p.
Так, и еще секунду - а как насчет
Код:
numb numb::operator +(const numb &p)const
{
        numb res = *this;
        res.add(4);
        return res;
}
?
Цитата:
и потом кто вас столько const’ов заставил написать?
А вот как раз на const'ы наезжать не надо. Их по-хорошему надо ставить везде, где только это возможно и не противоречит логике кода. Спросите, к примеру, у Скотта Мейерса.
Поясняю на конкретном примере.
const numb& res
гарантирует, что правый операнд оператора + не будет изменен внутри тела этого оператора (вы же наверняка удивитесь, если после выполнения операции 2+2 у вас то 2, что справа стало не 2, а 123,5?)
Объявление функции оператора как const гарантирует, что и левый операнд не будет изменен внутри тела оператора (левым операндом выступает сам объект класса).
Простые и красивые программы - коды программ + учебник C++
Создание игры - взгляд изнутри - сайт проекта
Тема на форуме, посвященная ему же
Гром вне форума Ответить с цитированием
Старый 30.11.2010, 12:21   #6
Chica Bond
Пользователь
 
Регистрация: 15.03.2010
Сообщений: 31
По умолчанию

res.add(4) я действительно использую просто для проверки как работает функция. на самом деле этот опрератор предназначен для сложения двух объектов класса, т.е.
Код:
int main()
{
numb a, b, c;
cin>>a>>b;
c=a+b;
return 0;
}
поэтому р и подаётся по ссылке, т.к. на самом деле оно будет использоваться, просто пока не пишу весь код...
вот мой класс, который представляет натуральное число в виде списка его цифр:
Код:
#include <iostream>
using namespace std;
struct list2
{
	int info;
	list2 *next;
	list2 *prev;
};

class numb
{
	friend class list2_it;
protected:
	list2 *first;
public:
	numb();
	~numb();
	numb(const numb &p);
	void add(int x);
	friend list2 *end_list(const numb &p);//поиск конца списка
	//арифметические операции:
	numb &operator =(const numb &p);
	numb operator +(const numb &p)const;
	numb &operator +=(const numb &p);
//и т.д.
};
если в res скопировать *this то всё равно программа не работает, она вместо "4" печатает "-57098"(какое-то такое число....)
операторы присваивания и копирования работаю правильно. если убрать деструктор в классе, то всё работает замечательно, вот поэтому я и решила что функция не может вернуть результат, так как после её работы он удаляется... а как исправить не знаю
Chica Bond вне форума Ответить с цитированием
Старый 30.11.2010, 20:09   #7
Chica Bond
Пользователь
 
Регистрация: 15.03.2010
Сообщений: 31
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
---------------

вовсе нет....
Chica Bond вне форума Ответить с цитированием
Старый 30.11.2010, 22:41   #8
AJlekceu
Пользователь
 
Регистрация: 20.11.2010
Сообщений: 16
По умолчанию

А нельзя ли увидеть описание конструктора копирования и функции add?
AJlekceu вне форума Ответить с цитированием
Старый 01.12.2010, 18:51   #9
Chica Bond
Пользователь
 
Регистрация: 15.03.2010
Сообщений: 31
По умолчанию

Цитата:
Сообщение от AJlekceu Посмотреть сообщение
А нельзя ли увидеть описание конструктора копирования и функции add?
конструктор копирования:
Код:
numb::numb(const numb &p)
{
	first=p.first;
}
функция add здесь вапще просто для виду, чтобы как-то рез поменять))
вот её код:
Код:
void numb::add(int x)
{
	list2 *q=new list2;
	q->info=x;
	q->next=first;
	q->prev=NULL;
	if (first)
		first->prev=q;
	first=q;
}
Chica Bond вне форума Ответить с цитированием
Старый 01.12.2010, 19:10   #10
Гром
Старожил
 
Аватар для Гром
 
Регистрация: 21.03.2009
Сообщений: 2,193
По умолчанию

Ну тогда все ясно. Вы же просто копируете указатель на область памяти, в которой располагаются данные из другого экземпляра класса. А что у нас происходит здесь?
Код:
numb numb::operator +(const numb &p)const
{
        numb res;
        res.add(4);
        return res;
}
Создается экземпляр класса numb, в него добавляется один узел, а затем происходит копирование с помощью operator= в экземпляр c. И затем память, выделенная под локальный объект освобождается. И теперь указатель c.first ссылается на невалидный мусор.
Сделайте конструктор копирования и operator= с полным копированием всей информации, примерно так:
Код:
numb::numb(const numb &p)
{
first = new list2;
first -> prev = 0;
first -> info = p.first -> info;
list2 *curr = first, *currp = p.first;
while (currp -> next)
 {
 list2* node = new list2;
 node -> prev = curr;
 node -> next = 0;
 node -> info = currp -> next -> info;
 curr -> next = node;
 curr = node;
 currp = currp -> next;
 }
}
и должно заработать.
Коряво, правда, как-то получилось, но суть, думаю, ясна.
Простые и красивые программы - коды программ + учебник C++
Создание игры - взгляд изнутри - сайт проекта
Тема на форуме, посвященная ему же
Гром вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Функция не возвращает значения 2.0 Winlook PHP 1 10.05.2010 00:58
Функция open() возвращает неверный дескриптор devl Общие вопросы C/C++ 8 12.01.2010 20:36
Как создать функцию, которая возвращает результат - строку типа ansistring. atg C++ Builder 2 28.10.2009 18:20
Что возвращает эта функция? D[I]K Общие вопросы C/C++ 9 07.10.2009 00:32
Функция StrtoFloat не правильно возвращает число Ra88it Помощь студентам 2 02.12.2008 20:26