powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / что делает оператов присваивания в моем коде?
25 сообщений из 64, страница 2 из 3
что делает оператов присваивания в моем коде?
    #38099591
покажете
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakovфлаг владельцаА в каком умном указателе используется флаг владельца и чем он лучше
счетчика ссылок?
В моём собственном. Не требует ссылки на структуру.

А не покажете его, когда там флаг устанавливается и как копирование происходит?
...
Рейтинг: 0 / 0
что делает оператов присваивания в моем коде?
    #38099634
MaximuS_G
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
список инициализацииТо что идет после имени конструктора после двоеточия - это список инициализации. В нем можно вызывать конструкторы членов класса.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
class Message
{
Message()
	: Text_("a")  // конструктор копирования
{
	Text_ = "b"; // оператор присваивания
}

private:
	unsigned Id_;
	std::string Text_;
};



Аналог без класса:
Код: plaintext
1.
2.
std::string Text_("a");
Text_ = "b";



Спасибо за комментарий. То есть это можно так инициализировать поля класса с помощью конструктора класса? Не совсем понимаю, зачем это надо...
...
Рейтинг: 0 / 0
что делает оператов присваивания в моем коде?
    #38099645
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
покажетекогда там флаг устанавливается и как копирование происходит?

В copy-конструкторе, натурально. И копирование происходит с помощью оператора присваивания.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
что делает оператов присваивания в моем коде?
    #38099650
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,

А зачем нужен этот смартуказатель с флагом владельца?
Почему нельзя применить простой указатель когда нет владения, и какой-нибудь unique_ptr для владения?
...
Рейтинг: 0 / 0
что делает оператов присваивания в моем коде?
    #38099651
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyПочему нельзя применить простой указатель когда нет владения, и
какой-нибудь unique_ptr для владения?
Затем, что право владения у меня переходящее и мне было проще изобрести собственный
велосипед чем ковыряться в STL.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
что делает оператов присваивания в моем коде?
    #38099653
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakovправо владения у меня переходящее
Мне просто хотелось обеспечить работоспособность кода
Код: sql
1.
throw MyException("Invalid value %d", v);


без лишних операций с динамической памятью и копированием её содержимого.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
что делает оператов присваивания в моем коде?
    #38099659
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,

Допустим (хотя auto_ptr/unique_ptr как раз и реализуют передачу владения - не знаю зачем ковыряться в STL чтобы это узнать).
Но наличие обертки над указателем, без гарантии что указатель еще валидный, создает ложное ощущение что управление автоматическое, хотя по сути контроль за валидностью указателя по прежнему лежит на программисте.
Т.е. состояние когда флаг владения не установлен - бессмысленно. Сам указатель должен быть таким флагом, а при передаче владения - обнуляться.
...
Рейтинг: 0 / 0
что делает оператов присваивания в моем коде?
    #38099668
Dimitry SibiryakovDimitry Sibiryakovправо владения у меня переходящее
Мне просто хотелось обеспечить работоспособность кода
Код: sql
1.
throw MyException("Invalid value %d", v);


без лишних операций с динамической памятью и копированием её содержимого.

А где тут могут возникнуть проблемы с динамической памятью?
...
Рейтинг: 0 / 0
что делает оператов присваивания в моем коде?
    #38099678
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyСам указатель должен быть таким флагом, а при передаче владения -
обнуляться.
Да, это было бы логично если бы я был уверен, что "старый" экземпляр уже не будет
использоваться после создания нового. Возможно, при следующей чистке кода я так и сделаю.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
что делает оператов присваивания в моем коде?
    #38099686
Mozok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
egorychMaximuS_G, это не конструктор, а оператор присваивания. и обязательно делай проверку на присваивание самому
ИМХО, согласен в этом плане с товарищем Саттером, который говорит,
что наличие таких проверок зачастую озаначает просчет в архитектуре.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
	Person& operator=(const Person& from)
	{
		char *temp = new char[strlen(from.Name)+1];
                strcpy(temp,from.Name);
		delete [] this->Name;
		this->Name = temp;
		
		return *this;
	}


И никаких проверок не нужно.
...
Рейтинг: 0 / 0
что делает оператов присваивания в моем коде?
    #38099696
MaximuS_G
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MozokegorychMaximuS_G, это не конструктор, а оператор присваивания. и обязательно делай проверку на присваивание самому
ИМХО, согласен в этом плане с товарищем Саттером, который говорит,
что наличие таких проверок зачастую озаначает просчет в архитектуре.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
	Person& operator=(const Person& from)
	{
		char *temp = new char[strlen(from.Name)+1];
                strcpy(temp,from.Name);
		delete [] this->Name;
		this->Name = temp;
		
		return *this;
	}


И никаких проверок не нужно.
Но в Вашем случае произойдет копирование данных, а в случае с проверкой - нет. Эти конструкторы по разному реагируют на присваивание одного и того же объекта друг другу. Или я не прав?
...
Рейтинг: 0 / 0
что делает оператов присваивания в моем коде?
    #38099703
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mozok,

Лучше (хоть по сути и то же самое) реализовать метод swap(T&) и тогда оператор копирования (как и swap) будет выглядеть тривиально (а значит менее подвержен ошибкам, в т.ч. из-за дублирования кода конструктора копирования):

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
	Person& operator=(const Person& from)
	{
		Person temp = from;
		swap(temp);
		return *this;
	}
	void swap(Person& other)
	{
	 	std::swap(Name, other.Name);
	}	
	


Таким образом останется реализовать только конструктор копирования, а не дублировать его логику в оператор.
...
Рейтинг: 0 / 0
что делает оператов присваивания в моем коде?
    #38099705
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MaximuS_GНо в Вашем случае произойдет копирование данных, а в случае с проверкой - нет. Эти конструкторы по разному реагируют на присваивание одного и того же объекта друг другу. Или я не прав?
Прав.
Но присвоение в себя - это ошибка кодирования.
В норме ее не должно быть.
А заниматься оптимизацией кода, который редко исполняется - это пустая трата ресурсов.
...
Рейтинг: 0 / 0
что делает оператов присваивания в моем коде?
    #38099713
Anatoly MoskovskyMozok,

Лучше (хоть по сути и то же самое) реализовать метод swap(T&) и тогда оператор копирования (как и swap) будет выглядеть тривиально (а значит менее подвержен ошибкам, в т.ч. из-за дублирования кода конструктора копирования):

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
	Person& operator=(const Person& from)
	{
		Person temp = from;
		swap(temp);
		return *this;
	}
	void swap(Person& other)
	{
	 	std::swap(Name, other.Name);
	}	
	


Таким образом останется реализовать только конструктор копирования, а не дублировать его логику в оператор.
Но при изменениях класса придется менять и void swap и конструктор копирования?

Либо наоборот :)
Код: plaintext
1.
2.
3.
4.
	Person(const Person& from)
	{
		*this = from;
	}


Останется реализовать только оператор = с глубоким копированием. При изменении класса придется менять только его.
...
Рейтинг: 0 / 0
что делает оператов присваивания в моем коде?
    #38099715
Anatoly MoskovskyMaximuS_GНо в Вашем случае произойдет копирование данных, а в случае с проверкой - нет. Эти конструкторы по разному реагируют на присваивание одного и того же объекта друг другу. Или я не прав?
Прав.
Но присвоение в себя - это ошибка кодирования.
В норме ее не должно быть.
А заниматься оптимизацией кода, который редко исполняется - это пустая трата ресурсов.
А присвоение в себя в данном случае можно как-то отловить во время компиляции?
...
Рейтинг: 0 / 0
что делает оператов присваивания в моем коде?
    #38099720
MaximuS_G
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyMaximuS_GНо в Вашем случае произойдет копирование данных, а в случае с проверкой - нет. Эти конструкторы по разному реагируют на присваивание одного и того же объекта друг другу. Или я не прав?
Прав.
Но присвоение в себя - это ошибка кодирования.
В норме ее не должно быть.
А заниматься оптимизацией кода, который редко исполняется - это пустая трата ресурсов.
Тогда я запутался, лучше делать проверку, или нет? :)
...
Рейтинг: 0 / 0
что делает оператов присваивания в моем коде?
    #38099733
Edd.Dragon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyНо присвоение в себя - это ошибка кодирования.

Ой ли?

Мания компактного кода заставляет каждого второго писать что-то типа
Код: plaintext
1.
b = (a > b ? a : b)



Но кто сказал, что это ошибка кодирования? Можно долго спорить о философской стороне вопроса. Но практическая сторона однозначно заявляет, что такой код совершенно корректен и не безсмысленен абсолютно, чтобы однозначно назвать его говонокодом.
...
Рейтинг: 0 / 0
что делает оператов присваивания в моем коде?
    #38099736
Edd.Dragon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MaximuS_GТогда я запутался, лучше делать проверку, или нет? :)
Делайте, делайте. При разработке универсальных контейнеров динамических данных лишняя проверка лишней не бывает. А для глубокой оптимизации сложных алгоритмов, работающих с динамическими данными нужно выбрасывать к чертям все эти универсальные контейнеры и писать велосипеды, реализующие алгоритм и структуры данных строго под задачу. В противном случае хоть с этой проверкой, хоть без нее при интенсивном использовании динамических строк, массивов и производных от них типов столько лишних телодвижений происходит, что эта проверка - капля в море. Но если таким путем достигаются иные выгоды, то и ладно.
...
Рейтинг: 0 / 0
что делает оператов присваивания в моем коде?
    #38099739
MaximuS_G
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Edd.DragonMaximuS_GТогда я запутался, лучше делать проверку, или нет? :)
Делайте, делайте. При разработке универсальных контейнеров динамических данных лишняя проверка лишней не бывает. А для глубокой оптимизации сложных алгоритмов, работающих с динамическими данными нужно выбрасывать к чертям все эти универсальные контейнеры и писать велосипеды, реализующие алгоритм и структуры данных строго под задачу. В противном случае хоть с этой проверкой, хоть без нее при интенсивном использовании динамических строк, массивов и производных от них типов столько лишних телодвижений происходит, что эта проверка - капля в море. Но если таким путем достигаются иные выгоды, то и ладно.
Ясно, спасибо! :)
...
Рейтинг: 0 / 0
что делает оператов присваивания в моем коде?
    #38099777
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Либо наоборотЛибо наоборот :)
Код: plaintext
1.
2.
3.
4.
	Person(const Person& from)
	{
		*this = from;
	}


Останется реализовать только оператор = с глубоким копированием. При изменении класса придется менять только его.
Нельзя вызывать присвоение для еще несконструированного объекта с мусором в полях.
Сначала надо создать валидный эземпляр.
...
Рейтинг: 0 / 0
что делает оператов присваивания в моем коде?
    #38099784
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Edd.DragonAnatoly MoskovskyНо присвоение в себя - это ошибка кодирования.

Ой ли?

Мания компактного кода заставляет каждого второго писать что-то типа
Код: plaintext
1.
b = (a > b ? a : b)



А где тут компактность?
Если уж компактно записывать то вот так (на 1 символ короче) :)
Код: plaintext
1.
if (a > b) b = a;


Но кто сказал, что это ошибка кодирования? Можно долго спорить о философской стороне вопроса. Но практическая сторона однозначно заявляет, что такой код совершенно корректен и не безсмысленен абсолютно, чтобы однозначно назвать его говонокодом.
Конечно это говнокод. Именно такой код получается когда стоит задача написать компактно, а не понятно.

Конкретно по проверке на присвоение в себя - эту проверку можно делать только для оптимизации.
Если без нее код присвоения работает неверно - то это неверная реализация присвоения.
...
Рейтинг: 0 / 0
что делает оператов присваивания в моем коде?
    #38099795
возможно?
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Anatoly MoskovskyЛибо наоборотЛибо наоборот :)
Код: plaintext
1.
2.
3.
4.
	Person(const Person& from)
	{
		*this = from;
	}


Останется реализовать только оператор = с глубоким копированием. При изменении класса придется менять только его.
Нельзя вызывать присвоение для еще несконструированного объекта с мусором в полях.
Сначала надо создать валидный эземпляр.
Все члены класса к этому моменту проинициализированы дефолтными значениями. За исключением тех у кого нет конструктора без параметров - их придется писать в списке инициализации.

А как возможно?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
struct Person {
int a, b, c;
	Person(const Person& from)
	{
		a = from.a;    // 1. возможно?
		this->b = from.b; // 2.  возможно?
		*this = from; // 3. возможно?
	}
};
...
Рейтинг: 0 / 0
что делает оператов присваивания в моем коде?
    #38099800
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
возможно?,

Это все возможно в некоторых частных случаях.
И будет работать до первого рефакторинга, когда один частный случай перейдет в другой.
...
Рейтинг: 0 / 0
что делает оператов присваивания в моем коде?
    #38099812
Anatoly Moskovskyвозможно?,

Это все возможно в некоторых частных случаях.
И будет работать до первого рефакторинга, когда один частный случай перейдет в другой.
Приведите пример когда это не будет работать?
...
Рейтинг: 0 / 0
что делает оператов присваивания в моем коде?
    #38099821
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Приведите примерAnatoly Moskovskyвозможно?,

Это все возможно в некоторых частных случаях.
И будет работать до первого рефакторинга, когда один частный случай перейдет в другой.
Приведите пример когда это не будет работать?
Например, почленное копирование из константной ссылки непотокобезопасно, т.к. неатомарно.
...
Рейтинг: 0 / 0
25 сообщений из 64, страница 2 из 3
Форумы / C++ [игнор отключен] [закрыт для гостей] / что делает оператов присваивания в моем коде?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]