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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 21.12.2012, 15:14   #11
Suby
Пользователь
 
Аватар для Suby
 
Регистрация: 03.11.2012
Сообщений: 89
По умолчанию

Цитата:
Сообщение от EUGY Посмотреть сообщение
Так что тут понимать. Выделил через new - один раз удалил через delete.
Если попытаться удалить второй раз уже освобожденный блок - вылетает с ошибкой. Поэтому при дублировании указателя на строку счетчик должен увеличиться на единицу, а в деструкторе, наоборот, декремент. И если он нулевой, только тогда вызов delete.
Не обращайте внимания на счетчик, представьте, что его там нету и не было никогда.
Меня интересует как правильно реализовать операцию копирования и присваивания. Скажу честно, не догоняю, покажите наглядно если не трудно, а то уже самому думать не получается, устал, закипел, все дела.
Suby вне форума Ответить с цитированием
Старый 21.12.2012, 15:15   #12
Blind Guard
Форумчанин
 
Регистрация: 14.03.2012
Сообщений: 139
По умолчанию

Как уже некоторые сказали (только другими словами) вам нужен smart-указатель.
Почитай, изучите и внедрите, по-мойму должно получиться
Blind Guard вне форума Ответить с цитированием
Старый 21.12.2012, 15:15   #13
Suby
Пользователь
 
Аватар для Suby
 
Регистрация: 03.11.2012
Сообщений: 89
По умолчанию

Цитата:
Сообщение от Abstraction Посмотреть сообщение
Выделили новый блок - копируйте в него содержимое старого. В случае классов (вроде std::string) лучше положиться на их оператор присваивания, а то вдруг в их "внутренностях" ещё цепочки указателей:
Код:
*name = *(n.name);
//А лучше - сразу name = new std::string(*n.name), он задействует конструктор копирования
В случае "простых" (заведомо не содержащих адресов) блоков памяти, можно использовать memcpy().

А. Всё, вопрос снят, сразу не заметил.
Вот, что мне и было нужно , щас буду пробовать.
Suby вне форума Ответить с цитированием
Старый 21.12.2012, 15:33   #14
Perchik71
С++, Delphi
Форумчанин
 
Аватар для Perchik71
 
Регистрация: 24.11.2012
Сообщений: 495
По умолчанию

Цитата:
Сообщение от Suby Посмотреть сообщение
Это я понял. Не пойму как реализовать по-нормальному.
операторы - = + / * создают копию объекта... возвращать новый объект не ссылку
операторы -= += *= /= изменяют сам объект.. возвращать this
операторы != == исключительно для if/else
Если помог, тут весы есть , Вам не сложно, а мне приятно.
Perchik71 вне форума Ответить с цитированием
Старый 21.12.2012, 15:53   #15
Suby
Пользователь
 
Аватар для Suby
 
Регистрация: 03.11.2012
Сообщений: 89
По умолчанию

Цитата:
Сообщение от Suby Посмотреть сообщение
щас буду пробовать.
Мдэ, что-то не выходит.
Ладно, щас буду перечитывать главу заново. А то видать я что-то важное пропустил или не усвоил
Спасибо всем отписавшимся! Хоть дали понять что я ниче не понимаю
Suby вне форума Ответить с цитированием
Старый 21.12.2012, 16:23   #16
EUGY
Форумчанин
 
Аватар для EUGY
 
Регистрация: 11.07.2010
Сообщений: 914
По умолчанию

Цитата:
Меня интересует как правильно реализовать операцию копирования и присваивания. Скажу честно, не догоняю, покажите наглядно если не трудно, а то уже самому думать не получается, устал, закипел, все дела.
Со счетчиком ссылок приблизительно так:
Код:
class xstr
{
	char*	zchr;
	int	refcnt;
public:
	xstr(const char* p) : refcnt()
	{
		zchr = new char[ strlen(p) + 1 ];
		strcpy(zchr, p);
	}
	~xstr()
	{
		
	}
	void addref()
	{
		refcnt ++;
	}
	void free()
	{
		refcnt --;
		if (!refcnt)
			delete [] zchr;
	}

};


class Work
{
private:
	xstr*	stringptr;
public:

	Work() : stringptr (new xstr(""))
	{
		stringptr->addref();
	}

	Work(const char* pc) : stringptr (new xstr(pc))
	{
		stringptr->addref();
	}

	Work(const Work& r) : stringptr(0)
	{
		stringptr = r.stringptr;
		stringptr->addref();
	}

	~Work(void)
	{
		stringptr->free();
		if (!stringptr->refcnt)
			delete stringptr;
	}

	Work& operator = (const char* pc)
	{
		stringptr->free();
		stringptr = new xstr(pc);
		stringptr->addref();
		return *this;
	}

	Work& operator = (const Work& r)
	{
		stringptr->free();
		stringptr = r.stringptr;
		stringptr->addref();
		return *this;
	}
	
};

void main()
{
	Work X1 = "qwerty";
	Work X2 = X1;
	X1 = "asdfg";
}
Пока набирал, наверняка где-то напортачил. Поэтому к коду подходить критично.

Последний раз редактировалось EUGY; 21.12.2012 в 16:44. Причина: поправил код
EUGY вне форума Ответить с цитированием
Старый 21.12.2012, 16:36   #17
Perchik71
С++, Delphi
Форумчанин
 
Аватар для Perchik71
 
Регистрация: 24.11.2012
Сообщений: 495
По умолчанию

Зачем вы портите объект....??????
я же сказал нельзя при таких this

a = b;
а получает b
но b это другой объект...
у вас знаете чё выйдет???
a += 8;
и b автоматом получит тоже самое...

Код:
const TType operator=(const TType& r)
	{
		TType  t;
                t.str = new char[strlen(r.str) + 1];
                strcpy(t.str, r.str);
		return t;
	}
Если помог, тут весы есть , Вам не сложно, а мне приятно.

Последний раз редактировалось Perchik71; 21.12.2012 в 16:39. Причина: сорь this здесь не нужен.
Perchik71 вне форума Ответить с цитированием
Старый 21.12.2012, 16:45   #18
Perchik71
С++, Delphi
Форумчанин
 
Аватар для Perchik71
 
Регистрация: 24.11.2012
Сообщений: 495
По умолчанию

я не трогую this потому что
a вызовет оператор и впехнёт b

конечно можно и на ваш манер но ссылку нельзя отправлять....
Код:
Код:
const TType/*&*/ operator=(const TType& r)
	{
                this->str = new char[strlen(r.str) + 1];
                strcpy(this->str, r.str);
		return *this;
	}
Если помог, тут весы есть , Вам не сложно, а мне приятно.
Perchik71 вне форума Ответить с цитированием
Старый 21.12.2012, 16:51   #19
EUGY
Форумчанин
 
Аватар для EUGY
 
Регистрация: 11.07.2010
Сообщений: 914
По умолчанию

Цитата:
Зачем вы портите объект....??????
я же сказал нельзя при таких this
?
При каких таких this?
Пример о копировании указателя, а не данных.
Возвращаемое значение не принципиально.
EUGY вне форума Ответить с цитированием
Старый 21.12.2012, 16:55   #20
Perchik71
С++, Delphi
Форумчанин
 
Аватар для Perchik71
 
Регистрация: 24.11.2012
Сообщений: 495
По умолчанию

для более шикарной ясности мы с берсом уже говорили на эту тему.
x = a + b;
a и b в вашем расскладе, портяться...
если создовать каждый раз новый объект...
не переживайте еструктор компил делает сам.
то a и b будут защещены и не изменены, а x получит значение.

Код:
int operator=(int& v)
{
    int i;
    i.v = v.v;
    return i;
}
int operator+(int& v)   // тут уже нужен this
{
    int i;
    i.v = this->v + v.v;
    return i;
}
Если помог, тут весы есть , Вам не сложно, а мне приятно.
Perchik71 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Выделение памяти Dady 1992 Общие вопросы C/C++ 2 26.06.2012 18:45
Распределение памяти. Динамическое выделение памяти с++ Tolian92 Помощь студентам 8 14.05.2012 21:44
Конструктор копирования и оператор присваивания DenisS0 Общие вопросы C/C++ 4 05.12.2011 10:41
До выделение памяти MAKTE Общие вопросы C/C++ 4 20.05.2008 21:34