Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 5.00/18: Рейтинг темы: голосов - 18, средняя оценка - 5.00
 Аватар для taras atavin
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562

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

11.06.2012, 15:42. Показов 4139. Ответов 22
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Как лучше запретить присваивание? Заприватить оператор и не делать его реализацию? Или как?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
11.06.2012, 15:42
Ответы с готовыми решениями:

Как запретить присваивание по возвращённой из функции ссылке?
Вопрос вот в чём. Есть класс с вложенным объектом (допустим контейнер, но не обязательно): class Class { vector<int>...

Запретить присваивание указателей
Доброго! Подскажите пожалуйста, можно ли запретить присваивание указателей? class A { //bla-bla-bla... }; class B { ...

Как запретить скачивание файла но не запретить его исполнение.
Я составил сайт простенький. На нем у меня есть исполнительный файл в формате JAR ( Java - архив). Возникла необходимость запретить...

22
 Аватар для Toshkarik
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
11.06.2012, 15:50
Присваивание чего?
0
Higher
 Аватар для diagon
1953 / 1219 / 120
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
11.06.2012, 15:51
Унаследоваться от boost::noncopyable, как вариант.
0
68 / 68 / 18
Регистрация: 03.06.2012
Сообщений: 176
11.06.2012, 15:58
Цитата Сообщение от taras atavin Посмотреть сообщение
Как лучше запретить присваивание?
Может быть я не про то думаю. А если просто объявить как const?
0
Заблокирован
11.06.2012, 16:05
Цитата Сообщение от taras atavin Посмотреть сообщение
Как лучше запретить присваивание? Заприватить оператор и не делать его реализацию? Или как?
Если объявить, но не определить - в любом случае operator= станет не доступным (ошибка компиляции, либо компоновки)

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

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

3. В студии можно ничайно запустить приватный operator=
(только в некоторых случаях: https://www.cyberforum.ru/post2152932.html )


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

Добавлено через 40 секунд
Цитата Сообщение от diagon Посмотреть сообщение
Унаследоваться от boost::noncopyable, как вариант.
Вы не путаете operator= и копирующий конструктор?
0
 Аватар для soon
2554 / 1319 / 178
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
11.06.2012, 16:05
Как вариант
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;
}
0
Заблокирован
11.06.2012, 16:09
Цитата Сообщение от 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 старушка не прожевала
0
 Аватар для taras atavin
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
11.06.2012, 16:14  [ТС]
Цитата Сообщение от Toshkarik Посмотреть сообщение
Присваивание чего?
Вообще запретить для своего класса использование его экземпляров в левой части оператора =.

Добавлено через 25 секунд
Цитата Сообщение от diagon Посмотреть сообщение
Унаследоваться от boost::noncopyable, как вариант.
А без буста?
0
 Аватар для Toshkarik
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
11.06.2012, 16:15
Bers, Так ошибка и должна быть на этапе компиляции. Я думаю Тарас этого и хотел;
0
 Аватар для taras atavin
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
11.06.2012, 16:15  [ТС]
Цитата Сообщение от g-h Посмотреть сообщение
А если просто объявить как const?
Запретить надо только =, а не всё, что меняет состояние объекта.
0
 Аватар для soon
2554 / 1319 / 178
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
11.06.2012, 16:16
Цитата Сообщение от Bers Посмотреть сообщение
Это что-то из нового стандарта ?
Он самый.
0
 Аватар для taras atavin
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
11.06.2012, 16:16  [ТС]
Цитата Сообщение от Bers Посмотреть сообщение
2. То, чего быть не должно - не должно быть в принципе. Если присваивать нельзя, то и метод создавать не нужно. Ибо зачем?
Меня беспокоит дефолтная версия с побайтным копированием.
0
 Аватар для Toshkarik
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
11.06.2012, 16:17
Перегрузите оператор как private, или с пустым телом.
0
 Аватар для taras atavin
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
11.06.2012, 16:19  [ТС]
Цитата Сообщение от Bers Посмотреть сообщение
ругой способ: объявить константный член данных.
Не пойдёт.

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

Добавлено через 39 секунд
Цитата Сообщение от Bers Посмотреть сообщение
//сие есть что?
Мне это тоже не понятно.
0
Заблокирован
11.06.2012, 16:20
Цитата Сообщение от 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;
}
По-моему, оно вообще не компилируется. М?
Тарас хотел код, который вообще никогда не взлетает?
0
 Аватар для taras atavin
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
11.06.2012, 16:21  [ТС]
Цитата Сообщение от Toshkarik Посмотреть сообщение
Bers, Так ошибка и должна быть на этапе компиляции. Я думаю Тарас этого и хотел;
Пока объекты не присваиваются, сам класс гну должна хавать без проблем.
0
 Аватар для Toshkarik
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
11.06.2012, 16:21
А ну я ж не знал какая у Вас именно ошибка Вот такой эффект я думаю должен быть.
0
Заблокирован
11.06.2012, 16:23
Цитата Сообщение от 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;
}
0
 Аватар для Toshkarik
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
11.06.2012, 16:23
Я не пойму, Вам нужно сделать так, что бы ошибка была во время выполнения программы?
0
Заблокирован
11.06.2012, 16:30
Цитата Сообщение от taras atavin Посмотреть сообщение
Меня беспокоит дефолтная версия с побайтным копированием.
Если ты объявил, но не определил, то никаких дефолтных версий компиль уже не создаст
Если ты использовал структуру аля NoEqually, то компиль в принципе сконструировать дефолтный оператор= уже не сможет.
При попытке такой оператор задействовать, будет ошибка времени компиляции
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
11.06.2012, 16:30
Помогаю со студенческими работами здесь

Как работает присваивание
#include <iostream> using namespace std; class A{ int a,b; A &operator=(const A &t){ cout<<3<<endl; ...

Присваивание уникального id как в 1с
Добрый день. Хочу реализовать нумерацию id строк таблицы моей бд, немного не допонимаю как это реализовали в 1с, а конкретнее нумерация у...

Присваивание класса как значения
Добрый день! Не могли бы вы подсказать, как сделать класс ссылкой на элемент класса. Например: ... class c1 { public: ...

Как сделать присваивание 2 картинок ImageIcon на Java Eclipse?
Всем привет. Ребят, делаю игру, столкнулся с проблемой в папке "res" у меня есть 2 картинки: L.png и V.png. Для того чтобы...

Как в двусвязном списке сделать перегрузку оператора присваивание
Добрый день. Мне нужно перегрузить оператор =, так чтобы один объект класса "Двусвязный список" присваивался другом объекту. ...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru