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

Как запретить присваивание? - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 8, средняя оценка - 4.88
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
11.06.2012, 15:42     Как запретить присваивание? #1
Как лучше запретить присваивание? Заприватить оператор и не делать его реализацию? Или как?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Toshkarik
 Аватар для Toshkarik
1139 / 856 / 50
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 1
11.06.2012, 15:50     Как запретить присваивание? #2
Присваивание чего?
diagon
Higher
 Аватар для diagon
1920 / 1186 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
11.06.2012, 15:51     Как запретить присваивание? #3
Унаследоваться от boost::noncopyable, как вариант.
g-h
67 / 67 / 1
Регистрация: 03.06.2012
Сообщений: 176
11.06.2012, 15:58     Как запретить присваивание? #4
Цитата Сообщение от taras atavin Посмотреть сообщение
Как лучше запретить присваивание?
Может быть я не про то думаю. А если просто объявить как const?
Bers
Заблокирован
11.06.2012, 16:05     Как запретить присваивание? #5
Цитата Сообщение от taras atavin Посмотреть сообщение
Как лучше запретить присваивание? Заприватить оператор и не делать его реализацию? Или как?
Если объявить, но не определить - в любом случае operator= станет не доступным (ошибка компиляции, либо компоновки)

Но определять его приватным будет уже не обязательно по целому ряду причин:
1. Такую защиту легко обойти (особенно, если ты извращенец, который любит усложнять жизнь себе и другим)

2. То, чего быть не должно - не должно быть в принципе. Если присваивать нельзя, то и метод создавать не нужно. Ибо зачем?

3. В студии можно ничайно запустить приватный operator=
(только в некоторых случаях: Баг компилятора? Или я чего то не догоняю? )


Другой способ: объявить константный член данных. Константы должны быть инициализированы в момент создания. Компилятор уже не сумеет построить дефолтный operator=
Но от такой практики вреда больше, чем пользы.

Добавлено через 40 секунд
Цитата Сообщение от diagon Посмотреть сообщение
Унаследоваться от boost::noncopyable, как вариант.
Вы не путаете operator= и копирующий конструктор?
soon
 Аватар для soon
2536 / 1301 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
11.06.2012, 16:05     Как запретить присваивание? #6
Как вариант
C++
1
2
3
4
5
6
7
8
9
10
11
struct Foo
{
    const Foo& operator=(const Foo&) = delete;
};
 
int main()
{
    Foo f;
    f = Foo();
    return 0;
}
Bers
Заблокирован
11.06.2012, 16:09     Как запретить присваивание? #7
Цитата Сообщение от soon Посмотреть сообщение
Как вариант
C++
1
2
3
4
5
6
7
8
9
10
11
struct Foo
{
    const Foo& operator=(const Foo&) = delete; //сие есть что?
};
 
int main()
{
    Foo f;
    f = Foo();
    return 0;
}
Это что-то из нового стандарта ? Просто моя 2008 старушка не прожевала
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
11.06.2012, 16:14  [ТС]     Как запретить присваивание? #8
Цитата Сообщение от Toshkarik Посмотреть сообщение
Присваивание чего?
Вообще запретить для своего класса использование его экземпляров в левой части оператора =.

Добавлено через 25 секунд
Цитата Сообщение от diagon Посмотреть сообщение
Унаследоваться от boost::noncopyable, как вариант.
А без буста?
Toshkarik
 Аватар для Toshkarik
1139 / 856 / 50
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 1
11.06.2012, 16:15     Как запретить присваивание? #9
Bers, Так ошибка и должна быть на этапе компиляции. Я думаю Тарас этого и хотел;
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
11.06.2012, 16:15  [ТС]     Как запретить присваивание? #10
Цитата Сообщение от g-h Посмотреть сообщение
А если просто объявить как const?
Запретить надо только =, а не всё, что меняет состояние объекта.
soon
 Аватар для soon
2536 / 1301 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
11.06.2012, 16:16     Как запретить присваивание? #11
Цитата Сообщение от Bers Посмотреть сообщение
Это что-то из нового стандарта ?
Он самый.
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
11.06.2012, 16:16  [ТС]     Как запретить присваивание? #12
Цитата Сообщение от Bers Посмотреть сообщение
2. То, чего быть не должно - не должно быть в принципе. Если присваивать нельзя, то и метод создавать не нужно. Ибо зачем?
Меня беспокоит дефолтная версия с побайтным копированием.
Toshkarik
 Аватар для Toshkarik
1139 / 856 / 50
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 1
11.06.2012, 16:17     Как запретить присваивание? #13
Перегрузите оператор как private, или с пустым телом.
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
11.06.2012, 16:19  [ТС]     Как запретить присваивание? #14
Цитата Сообщение от Bers Посмотреть сообщение
ругой способ: объявить константный член данных.
Не пойдёт.

Добавлено через 29 секунд
Цитата Сообщение от Bers Посмотреть сообщение
Вы не путаете operator= и копирующий конструктор?
И до него доберусь.

Добавлено через 39 секунд
Цитата Сообщение от Bers Посмотреть сообщение
//сие есть что?
Мне это тоже не понятно.
Bers
Заблокирован
11.06.2012, 16:20     Как запретить присваивание? #15
Цитата Сообщение от Toshkarik Посмотреть сообщение
Bers, Так ошибка и должна быть на этапе компиляции. Я думаю Тарас этого и хотел;
C++
1
2
3
4
5
6
7
8
9
10
11
12
struct Foo
{
    const Foo& operator=(const Foo&) = delete; //: error C2059: синтаксическая ошибка: ;
};
 
int main()
{
    Foo f;
    //f = Foo();
 
    return 0;
}
По-моему, оно вообще не компилируется. М?
Тарас хотел код, который вообще никогда не взлетает?
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
11.06.2012, 16:21  [ТС]     Как запретить присваивание? #16
Цитата Сообщение от Toshkarik Посмотреть сообщение
Bers, Так ошибка и должна быть на этапе компиляции. Я думаю Тарас этого и хотел;
Пока объекты не присваиваются, сам класс гну должна хавать без проблем.
Toshkarik
 Аватар для Toshkarik
1139 / 856 / 50
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 1
11.06.2012, 16:21     Как запретить присваивание? #17
А ну я ж не знал какая у Вас именно ошибка Вот такой эффект я думаю должен быть.
Bers
Заблокирован
11.06.2012, 16:23     Как запретить присваивание? #18
Цитата Сообщение от taras atavin Посмотреть сообщение
Не пойдёт.
Уверен?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
struct NoEqually
{
    NoEqually(const int val): mConst(val){}
    const int mConst;
};
 
struct Foo: public NoEqually
{
    Foo():NoEqually(0){}
};
 
int main()
{
    Foo f;
 
    f = Foo(); //: error C2582: функция 'operator =' недоступна в 'Foo'
    
    return 0;
}
Toshkarik
 Аватар для Toshkarik
1139 / 856 / 50
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 1
11.06.2012, 16:23     Как запретить присваивание? #19
Я не пойму, Вам нужно сделать так, что бы ошибка была во время выполнения программы?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.06.2012, 16:30     Как запретить присваивание?
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
Bers
Заблокирован
11.06.2012, 16:30     Как запретить присваивание? #20
Цитата Сообщение от taras atavin Посмотреть сообщение
Меня беспокоит дефолтная версия с побайтным копированием.
Если ты объявил, но не определил, то никаких дефолтных версий компиль уже не создаст
Если ты использовал структуру аля NoEqually, то компиль в принципе сконструировать дефолтный оператор= уже не сможет.
При попытке такой оператор задействовать, будет ошибка времени компиляции
Yandex
Объявления
11.06.2012, 16:30     Как запретить присваивание?
Ответ Создать тему
Опции темы

Текущее время: 02:55. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru