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

Как лучше запретить копирование объекта?

13.12.2014, 13:15. Показов 17025. Ответов 57
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть класс, надо запретить копирование его экземпляров. Можно как то сделать, чтоб в интерфейсе класса вообще не было конструктора копии и оператора копирующего присваивания?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
13.12.2014, 13:15
Ответы с готовыми решениями:

Как запретить копирование с флешки?
Доброе утро! Поскажите, пожалуйста, как запретить копирование с флешки? Хочу распечатать документ, но не хочу, чтобы осталась копия...

Как запретить копирование диска?
Люди добрые !!! Мучаюсь уже третий день не как не могу сделать так чтобу ДВД видео могли увидеть не не смогли копировать!!! стли...

Как обойти "запретить копирование"
Вкладка Параметры доставки - основные - галочка на запрет копирования. У получателя соответственно не получаеться распечатать, скопировать...

57
 Аватар для taras atavin
4226 / 1799 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
14.12.2014, 08:20  [ТС]
Студворк — интернет-сервис помощи студентам
Вот это как раз пустышки, а не потомки. Они не имеют смысла.
0
3258 / 2060 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
14.12.2014, 08:23
Цитата Сообщение от taras atavin Посмотреть сообщение
Вот это как раз пустышки, а не потомки.
Просто для примера в них была опущена реализация, чтобы не загромождать.
0
 Аватар для taras atavin
4226 / 1799 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
14.12.2014, 12:21  [ТС]
Цитата Сообщение от 0x10 Посмотреть сообщение
Просто для примера в них была опущена реализация,
в самом noncopyable.
0
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
14.12.2014, 14:28
Цитата Сообщение от taras atavin Посмотреть сообщение
Вот это как раз пустышки, а не потомки. Они не имеют смысла.
Мне кажется ты конкретно что-то недопонимаешь.
Давай еще раз: noncopyable делает потенциального потомка некопируемым. Т.е. этот класс предназначен для того, чтобы от него отнаследовались и получили в наследнике запрет копирования. Ты же сам просил, чтобы в целевом классе не было конструктора копирования и оператора присваивания:
Можно как то сделать, чтоб в интерфейсе класса вообще не было конструктора копии и оператора копирующего присваивания?
Это и есть тот способ, который ты просил.
К слову, в boost используется точно такая же реализация noncopyable, как я привел.

Добавлено через 27 минут
Цитата Сообщение от taras atavin Посмотреть сообщение
А кто Вам сказал, что у класса вообще есть наследники?
Мы сами это сказали, сделав его конструктор без параметров и деструктор protected. Нет иного выбора для использования, кроме как сделать наследование.
Вообще, чтобы ты знал, разрешение контракта на этапе компиляции очень полезная практика, к использованию которой всегда надо стремиться.
Цитата Сообщение от taras atavin Посмотреть сообщение
По Вашему если экземпляр нельзя копировать, то класс - пустышка и ему нельзя иметь ни одного экземпляра, а запретить копирование надо не его экземпляров, а экземпляров потомков? Ну так замкнутый круг до бесконечности, порочным называемый: так как экземпляры потомков запрещено копировать, то по-Вашему они также не имеют смысла, это пустышки и запретить копирование надо уже для их потомков, но они тоже - пустышки по той же причине.
Нет, совсем не верно. По-нашему, - это есть зафиксированный утилитный класс и мы его применяем в качестве mix-in`а (ссылка) к тем нашим (твоим) классам, которые нужно сделать некопируемыми. Это такой прием. Причем древний. Он прекрасно гуглится.

Добавлено через 8 минут
taras atavin, В общем непонятно откуда вообще ты взял такие выводы про замкнутый круг и др.
Возьми да попробуй в конце концов. Увидишь, что никакого замкнутого круга нет Ответ тебе дали. Он верный. Подтвержден практикой и используется многими людьми по всему миру. Больше добавить нечего.
1
 Аватар для taras atavin
4226 / 1799 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
14.12.2014, 15:32  [ТС]
Цитата Сообщение от DrOffset Посмотреть сообщение
В общем непонятно откуда вообще ты взял такие выводы про замкнутый круг и др.
Возьми да попробуй в конце концов. Увидишь, что никакого замкнутого круга нет
Эйси.
C++
1
2
3
4
5
6
7
8
9
class NonCopyable
{
  protected:
    NonCopyable () {}
    ~NonCopyable () {} /// Protected non-virtual destructor
  private: 
    NonCopyable (const NonCopyable &);
    NonCopyable & operator = (const NonCopyable &);
};
. Так как нельзя копировать экземпляры, то данный класс бессмыслен, а все экземпляры должны быть экземплярами CantCopy. Декларируем этот класс:
C++
1
2
class CantCopy : private NonCopyable
{};
. Но экземпляры этого класса тоже нельзя копировать, значит данный класс тоже бессмыслен, а все экземплярами CantCopy2. Декларируем этот класс:
C++
1
2
class CantCopy2 : private CantCopy
{};
. И так до бесконечности.

А теперь как на самом деле. Из того, что экземпляр нельзя копировать не следует, что он не может существовать, наоборот, класс должен иметь собственные экземпляры, не имеют смысла только его потомки, поэтому их в проекте нет. Вообще не декларированы, ни один класс не наследует от данного. Более того, запретить надо копирование только экземпляров данного класса, а если бы какие либо его потомки имели бы смысл, то имела бы смысл и операция их копирования, соответственно в них конструктор копии и оператор копирующего присваивания как раз должны были бы быть.

Добавлено через 12 минут
Так что дефолтный конструктор как раз public. Кстати, абстрактые классы в обязательном порядке имеют не реализованные и перегружаемые в потомках виртуальные члены. Ну и где это здесь? Соответственно необходимость потомков не прослеживается. А дефолтный конструктор в protectd блокирует только создание экземпляров без использования параметров конструктора и, соответственно, создание динамических массивов безымянных экземпляров. Да и то за исключением локальных экземпляров в методах и операторах-членов как данного класса, так и потомков.
Ну и деструктор в protecte ограничивает область видимости экземпляров методами и операторами-членами данного класса и его потомков.

Добавлено через 1 минуту
Цитата Сообщение от DrOffset Посмотреть сообщение
Ты же сам просил, чтобы в целевом классе не было конструктора копирования и оператора присваивания:
Можно как то сделать, чтоб в интерфейсе класса вообще не было конструктора копии и оператора копирующего присваивания?
В самом классе, а не в его потомках.

Добавлено через 6 минут
Цитата Сообщение от DrOffset Посмотреть сообщение
taras atavin, В общем непонятно откуда вообще ты взял такие выводы про замкнутый круг и др.
А откуда вообще вылезла абстрактность некопируемого класса? По бритве оккама не следует множить сущности на пустом месте, значит абстрактность класса из чего то выведена. Из чего? Единственный априорно известный признак - некопируемость, значит из неё. Но она распространяется на всех потомков, если из неё следует абстракность, значит они тоже должны быть абстрактны, причём, все. Абстрактный базовый класс ни кто не просил.
0
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
14.12.2014, 15:33
Цитата Сообщение от taras atavin Посмотреть сообщение
И так до бесконечности.
А зачем это делать?

Цитата Сообщение от taras atavin Посмотреть сообщение
А теперь как на самом деле. Из того, что экземпляр нельзя копировать не следует, что он не может существовать, наоборот, класс должен иметь собственные экземпляры, не имеют смысла только его потомки, поэтому их в проекте нет.
А где кто-то говорил, что экземпляр не может существовать?
Я говорил, что только сам noncopyable не имеет смысла создавать просто так, отдельно от всех. Это разные вещи. Класс, который ты от него наследуешь имеет смысл создавать, его-то конструкторы никто не помещает в private\protected.
Класс noncopyable создается один раз. Это как библиотечная сущность, вспомогательная. Никаких иерархий из них делать не предлагается и не предполагается. Он используется с целью навесить некопируемость на своего конкретного потомка. Это пример того, как в С++ иногда используется наследование вне контекста ООП. Ссылки хоть посмотри, там же все это объясняется.
Не спорь, разберись.

Добавлено через 42 секунды
Цитата Сообщение от taras atavin Посмотреть сообщение
Но она распространяется на всех потомков, если из неё следует абстракность, значит они тоже должны быть абстрактны, причём, все.
Ничего подобного.
0
 Аватар для taras atavin
4226 / 1799 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
14.12.2014, 15:34  [ТС]
Цитата Сообщение от DrOffset Посмотреть сообщение
А где кто-то говорил, что экземпляр не может существовать?
Я говорил, что только сам noncopyable не имеет смысла создавать просто так, отдельбно от всех.
Я и говорю об экземпляре самого noncopyable.
0
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
14.12.2014, 15:35
Цитата Сообщение от taras atavin Посмотреть сообщение
А откуда вообще вылезла абстрактность некопируемого класса?
Абстрактных классов тут нет вообще.

Добавлено через 39 секунд
Цитата Сообщение от taras atavin Посмотреть сообщение
Я и говорю об экземпляре самого noncopyable.
Зачем ты о нем говоришь?
0
 Аватар для taras atavin
4226 / 1799 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
14.12.2014, 15:41  [ТС]
Цитата Сообщение от DrOffset Посмотреть сообщение
Это как библиотечная сущность, вспомогательная. Никаких иерархий из них делать не предлагается и не предполагается. Он используется с целью навесить некопируемость на своего конкретного потомка.
А с какого он у Вас станет конкретным? Он же тоже не копируемый, из чего выведена абстрактность.

Добавлено через 2 минуты
Цитата Сообщение от DrOffset Посмотреть сообщение
Абстрактных классов тут нет вообще.
Как это?
Цитата Сообщение от 0x10 Посмотреть сообщение
делать его наследников некопируемыми. Создание объектов самого класса noncopyable смысла не имеет,
А это как раз определение абстрактного класса. В отличие от конкретных классов, которые могут иметь экземпляры, не являющиеся экземплярами их потомков. Разберитесь для начала в терминах.
0
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
14.12.2014, 15:44
Цитата Сообщение от taras atavin Посмотреть сообщение
А с какого он у Вас станет конкретным? Он же тоже не копируемый, из чего выведена абстрактность.
У понятия абстрактный класс есть вполне конкретное определение в С++. Давай не будем придумывать термины.
Правильно этот класс называется mix-in. Я тебе давал выше ссылку. Вот определение оттуда:
При́месь (англ. mix in) — элемент языка программирования (обычно класс или модуль), реализующий какое-либо чётко выделенное поведение. Используется для уточнения поведения других классов, не предназначен для порождения самостоятельно используемых объектов.
Добавлено через 1 минуту
Цитата Сообщение от taras atavin Посмотреть сообщение
Разберитесь для начала в терминах.
Вот сам и разберись.
На языке программирования C++ абстрактный класс объявляется включением хотя бы одной чистой виртуальной функции.
0
 Аватар для taras atavin
4226 / 1799 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
14.12.2014, 15:44  [ТС]
Цитата Сообщение от DrOffset Посмотреть сообщение
У понятия абстрактный класс есть вполне конкретное определение в С++. Давай не будем придумывать термины.
Я и не придумываю. И не в языке c++, а вообще в объектно-ориентированном проектировании.
Абстрактным классом называется класс, который не может иметь экземпляров, не являющихся одновременно экземплярами его потомков.
.
0
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
14.12.2014, 15:48
Цитата Сообщение от taras atavin Посмотреть сообщение
И не в языке c++, а вообще в объектно-ориентированном проектировании.
Мы находимся в разделе С++. И я настаиваю на том, что использовать нужно терминологию, которая принята в С++.
0
 Аватар для taras atavin
4226 / 1799 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
14.12.2014, 15:54  [ТС]
Это:
На языке программирования C++ абстрактный класс объявляется включением хотя бы одной чистой виртуальной функции, типа virtual _сигнатура_функции_ =0;, которая, как и другие, может быть заменена.
способ сделать класс абстрактным, а гарантированное отсутствие собственных экземпляров - определяющий признак. В других языках способом могло бы быть применение ключевого слова abstract совместно с ключевым словом class, или вместо него.
Code
1
2
3
4
class abastact A
{
 ...
};
,
Code
1
2
3
4
class A=abastact
{
 ...
};
,
Code
1
2
3
4
5
class A
{
 abastact
 ...
};
,
Code
1
2
3
4
5
abstract A
{
 abastact
 ...
};
, или же может быть предусмотрен любой другой синтаксис. Но если семантика этого синтаксиса - запрет экземпляров непосредственно данного класса, то класс с таким синтаксисом абстрактен.

Добавлено через 2 минуты
Цитата Сообщение от DrOffset Посмотреть сообщение
Мы находимся в разделе С++. И я настаиваю на том, что использовать нужно терминологию, которая принята в С++.
Понятие общее для ООП вообще. Если не согласны, предложите комитету назвать конкретно на языке c++ компилятором потоковый класс. Можно в связи с разделом избегать термина "метод" и заменять его словосочетанием "функция-член", на других языках обозначающее не самостоятельную сущность, а вид метода. Но c++ в них не входит и термины оттуда не наследует. А в ООП входит. Соответственно общие понятия имеют те же определения.
0
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
14.12.2014, 16:04
taras atavin, спор ни о чем.
В С++ у абстрактного класса конкретное определение.
Абстрактный класс предполагает, что он интерфейс, либо может им быть.

В нашем случае наследование - закрытое, следовательно это синтаксический вариант включения, а не каноническое ООП наследование - это раз.
И никакого интерфейса noncopyable не предоставляет - это два.
С++ никогда не реализовывал ООП в чистом виде с идеологической точки зрения. Оно всегда было чуть свое - это три.

Иными словами, раз уж мы в разделе по С++, то общаться нужно в терминах С++, дабы не путать себя и собеседников.

Добавлено через 1 минуту
taras atavin, мы ушли от темы. Что-то осталось непонятным?
0
 Аватар для taras atavin
4226 / 1799 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
14.12.2014, 16:11  [ТС]
Цитата Сообщение от DrOffset Посмотреть сообщение
Абстрактный класс предполагает, что он интерфейс, либо может им быть.
Не выдумывай.

Добавлено через 1 минуту
Цитата Сообщение от DrOffset Посмотреть сообщение
С++ никогда не реализовывал ООП в чистом виде с идеологической точки зрения. Оно всегда было чуть свое - это три.
Ни кто не реализовывал просто дверь в чистом виде, у всех она какая то своя.
0
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
14.12.2014, 16:16
Цитата Сообщение от taras atavin Посмотреть сообщение
Не выдумывай.
Даже и не пытался. В С++ ты не можешь создать абстрактный класс, который бы одновременно не являлся интерфейсом. По определению.

Добавлено через 49 секунд
Цитата Сообщение от taras atavin Посмотреть сообщение
Ни кто не реализовывал просто дверь в чистом виде, у всех она какая то своя.
Хорошо, что ты это понимаешь.
Теперь ты на шаг ближе к осознанию того, что о частных случаях в общем виде рассуждать неконструктивно.
0
 Аватар для taras atavin
4226 / 1799 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
14.12.2014, 16:16  [ТС]
Цитата Сообщение от DrOffset Посмотреть сообщение
В нашем случае наследование - закрытое, следовательно это синтаксический вариант включения, а не каноническое ООП наследование - это раз.
Агрегирование объекта предполагает, что все члены другого класса собираются в объект, имеющий смысл в виде самостоятельной сущности и уже этот объект становится объектом-членом данного класса. Ну как как зовут объект-член в данном случае?
0
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
14.12.2014, 16:18
taras atavin, По первоначальной теме есть что добавить?
0
 Аватар для taras atavin
4226 / 1799 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
14.12.2014, 16:18  [ТС]
Цитата Сообщение от DrOffset Посмотреть сообщение
Теперь ты на шаг ближе к осознанию того, что о частных случаях в общем виде рассуждать неконструктивно.
Понятие абстрактного метода общее. Назови ручку на своей двери абырвалгом и ругайся со всеми гостями из-за применения ими общего слова.
0
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
14.12.2014, 16:22
Цитата Сообщение от taras atavin Посмотреть сообщение
Понятие абстрактного метода общее. Назови ручку на своей двери абырвалгом и ругайся со всеми гостями из-за применения ими общего слова.
Все нормальные программисты С++ прекрасно понимают о чем идет речь, когда говорят про "абстрактный класс". Я бы поддержал тебя, будь мы в разделе ООП или еще каком общем теоретическом форуме.
Повторю вопрос.
Цитата Сообщение от DrOffset Посмотреть сообщение
taras atavin, По первоначальной теме есть что добавить?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
14.12.2014, 16:22

Как запретить копирование данных с диска
Я сделал видео курс и запишу его на диск. Как мне сделать чтоб нельзя было скопировать эти данный на хард диск только просматривать с...

Как запретить копирование текста из RichtextBox в буфер обмена?
Задача такая: выводить текст на форму так, чтобы его можно было только читать. Пробовал использовать Label, но без полос прокрутки текста...

Как запретить заход одного объекта на другой?
Как запретить заход одного объекта на другой силами VS2008??? using System; using System.Collections.Generic; using...

Как запретить создание объекта в таком случае
Есть код class Component{ virtual void doSomething() = 0; }; class Object{ public: template<typename T>

Как запретить использование метода из объекта класса, содержащегося в классе?
class a { public: void set(int x, int y) { mX = x; mY = y; } int getX() { return mX; } int getY() { return mY; }


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Генератор паролей (вариант №4)
Maks 01.11.2026
После публикации 3-го варианта генератора паролей, разослал его своим коллегам (с целью оценки), в итоге были получены следующие рекомендации: 1. Вернуть возможность использования знаков | 1 l I;. . .
Генератор паролей (вариант №3)
Maks 30.10.2026
Финальная версия генератора паролей 1С. Доработка решения в этот раз коснулась только визуальной части, а именно, добавлен реквизит ДопПараметры (тип Булево), который скрывает/ отображает реквизиты:. . .
Магическое мышление и магия, современная наука не отличима от магии (говорит ИИ Джемени)
zorxor 30.10.2026
Джемени, расскажи, пожалуйста, что такое магическое мышление, что такое магия, почему современная наука чем-то напоминает магию? Фраза «Любая достаточно развитая технология неотличима от магии». . .
За какое время ИИ может подобрать пароль по хешу (рассказывает Джемени ИИ)
zorxor 30.10.2026
Расскажи, Джемени, если известен хэш МД5, например, за сколько ИИ сможет подобрать соответствующий пароль? Искусственный интеллект (ИИ) может подобрать простой или средний по сложности пароль по. . .
Кто убил Suno? Почему наше солнышко погасло? (диалог с ИИ Джемени)
zorxor 30.10.2026
Как убивали Suno. Хронология. «Убийство» музыкальной нейросети Suno — это затяжной процесс, в котором технологический хайп стартапа разбился о жесткую реальность судебных исков от гигантов. . .
Генератор паролей (вариант №2)
Maks 30.10.2026
Обновленная версия ранее созданной обработки. Добавлены следующие реквизиты типа Булево: - Буквы; - Цифры; - Символы. Изменена логика команды "Сгенерировать" и процедуры "ПриОткрытии":. . .
Генератор паролей (вариант №1)
Maks 29.10.2026
Реализация из решения ниже выполнена исключительно по моей инициативе, дабы облегчить себе работу в создании паролей для администрируемых мною сервисов и пользователей. Самым главным критерием для. . .
Установка ChatGPT (Codex) на Windows без использования Microsoft Store
Fabien159 28.10.2026
Здравствуйте всем читающим! Опишу процесс установки ChatGPT (Codex) на Windows, если по каким-то причинам у вас не получается устанавить его через Microsoft Store. И так: 1. Скачиваем с. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru