4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
|
|
1 | |
Как лучше запретить копирование объекта?13.12.2014, 13:15. Показов 15129. Ответов 57
Метки нет (Все метки)
Есть класс, надо запретить копирование его экземпляров. Можно как то сделать, чтоб в интерфейсе класса вообще не было конструктора копии и оператора копирующего присваивания?
0
|
13.12.2014, 13:15 | |
Ответы с готовыми решениями:
57
Как запретить копирование с флешки? Как запретить копирование диска? Как обойти "запретить копирование" Как запретить копирование данных с диска |
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
|
|
14.12.2014, 16:28 [ТС] | 41 |
Есть. Есть агрегирующий конеретный класс, не являющийся предком других классов и имеющий как минимум один собственный именованный экземпляр. Все экземпляры данного класса декларируются только с помощью конструктора по умолчанию. Требуется запретить копирование экземпляров только данного класса и сделать так, чтоб всякое присваивание одного экземпляра другому было перемещающим, данные признаки не должны распространяться на потомки, если таковые появятся в будущем. Потомки копироваться должны и для них присваивание по умолчанию должно означать копирование. Нет ни какой сущности, которая могла бы объединить данный класс с каким либо другим и такая сущность не может иметь смысл.
0
|
14.12.2014, 16:37 | 42 | |||||
Как сделать три (аналогично - десять-двадцать-сто...) класса некопируемых сущностей с минимальными затратами и с минимальным риском в одном (-двух-пятнадцати...) из них где-то случайно накосячить:
0
|
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
|
||||||
14.12.2014, 16:49 [ТС] | 43 | |||||
Как сделать два-сто-тысячу сущностей, содержащих поле типа std::string и с минимальным риском в одном из них где-нибудь накосячить? Не смешно. Тем более, что проще накосячить при наследовании, чем в написании одного признака.
Добавлено через 4 минуты Чёрта с два. Человека с петом нельзя объединять ни какой сущностью кроме биологического надтаксона. Учите UML. Там ясно сказано, что прежде чем создавать базовый класс для нескольких других классов, следует убедиться в том, что общие признаки этих классов есть следствие родства самих классов. А отсюда единственная допустимая сущность, объединяющая человека с собакой - млекопитающее. А если с рыбой, то позвоночное. А если ты червей разводишь, то уже животное (мы тоже в этом царстве). Поэтому
0
|
14.12.2014, 16:53 | 44 | |||||
Нарушение LSP, нет?
Только делать какой-нибудь некопирующий миксин к классу, и использовать его вместо самого класса. Или что-то такого рода (не уверен, что скомпилируется, это только набросок):
0
|
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
|
|
14.12.2014, 16:56 [ТС] | 45 |
Нарушение белорусского музыканта? Не смешно. Нарушение легчайшей суперсимметричной частицы? Подавно.
0
|
14.12.2014, 16:59 | 46 | |||||
Добавлено через 1 минуту Нарушение Liskov Substitution Principle для тех, кто новичок в ООП. Смешно.
0
|
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
|
|
14.12.2014, 17:08 [ТС] | 47 |
А ни как проще нельзя было написать? Зачем обязательно нужны импортные аббревиатуры? Я то вику читать умею, но в тему может забрести кто угодно. И да, мне нужен именно не наследуемый признак.
Добавлено через 52 секунды Стаж программирования не означает понимания идеологии ООП. Добавлено через 5 минут Что у Ваших "игровых объектов" закономерно общего? Имя у человека и у пета? А я может пишу игру, в которой петы безымянны? Общие признаки/операции должны вытекать из родства классов, а не наоборот. И не надо смешивать наследование со случайным совпадением признаков не родственных сущностей, или операций над ними. Ладно ещё класс "существо", это ещё можно понять. Но звезда каким боком к человеку? Это уже не ООП.
0
|
18844 / 9843 / 2408
Регистрация: 30.01.2014
Сообщений: 17,285
|
|
14.12.2014, 17:26 | 48 |
Можно в потомках просто не вызывать конструктор копирования/оператор присваивания базового класса.
В изначальном сообщении, к тому же, не было подобных деталей (особенно насчет перемещения). Тут стоит отметить, что как-только мы определили в классе собственные оператор\конструктор перемещения, то присваивающие их версии автоматически помечаются как deleted. Вернуть их в строй после этого можно только явно определив, если мы этого не сделаем, то класс так и останется перемещаемым, но некопируемым. И в этом случае можно обходиться без идиомы noncopyable вообще. Естественно это применимо только к С++11, в С++03 все несколько сложнее и noncopyable пришлось бы оставить. А функции перемещения заменить на явные swap. Вот небольшая иллюстрация на примере массива. Добавлено через 4 минуты Я же говорил, что в С++ наследование применяется для разных целей. В том числе в разрез с каноническим использованием. Читай Саттера и Мейерса. Справедливости ради стоит отметить, что приватное наследование не реализует отношение "является", о которым ты говорил, т.е. оно не предполагает родства, именно поэтому оно здесь используется. И служит только в качестве сервисного средства, чтобы заставить компилятор контролировать нужные нам свойства класса (для чего и нужны mix-ins). Так что никаких основополагающих концепций мы не нарушили этим кодом.
0
|
14.12.2014, 17:29 | 49 |
Человек и пет, унаследованные от GameObject - это уже другие классы, никак не связанные с унаследованными от NonCopyable, родом из другого проекта. К сожалению, у них оказались одинаковые имена с теми, другими.
Эта пятерка классов имеет общее то, что является частью абстрактной (не путать с абстрактными классами, абстрактным мышлением и абстрактным искусством!) простенькой игры. Игровые объекты могут находиться на карте, взаимодействовать друг с другом, отображаться на экране и т.п. Поскольку игра простенькая, то мы не выделяем отдельно PhysicalObject, GraphicalObject, ScryptableObject и другие, и валим весь функционал в GameObject. К сожалению, я не могу позволить себе потратить ближайшие несколько месяцев на объяснение вам того ООП, каким оно является для меня и многих других людей, не совпадающих с вами, поэтому вынужден отправить вас гуглить информацию о данной интерпретации ООП. Данная ссылка будет хорошим началом для ваших поисков.
0
|
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
|
|
14.12.2014, 17:31 [ТС] | 50 |
0
|
14.12.2014, 17:54 | 51 | |||||||||||||||||||||||||
Ни в одном из этих пяти классов
Нет у классов
Еще раз. Ниже представлены четыре РАЗНЫХ класса (у двух пар из них, так уж случилось, имена совпадают; но эти пары из разных проектов, и находятся в разных файлах исходного кода):
Dixi.
0
|
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
|
|
14.12.2014, 18:01 [ТС] | 52 |
По-английски даже название - это имя. Кроме того, прозвище (чем оно не кличка) - это тоже вид имени.
0
|
3 / 3 / 0
Регистрация: 14.07.2012
Сообщений: 86
|
||||||
22.07.2022, 20:57 | 54 | |||||
Прошу прощения за некропост, начал изучать SFML и столкнулся с данной задачей.
0
|
Неэпический
|
||||||
22.07.2022, 21:15 | 55 | |||||
Просто объявляют конструктор копирования и оператор присваивания.
Объявляют их в private, поэтому никто к ним доступа не имеет и еще оставляют без реализации эти функции. Соответственно, у наследника компилятор не будет генерировать конструктор копирования. В С++11 вы можете сделать так:
Idioms/Non-copyable Mixin
1
|
3 / 3 / 0
Регистрация: 14.07.2012
Сообщений: 86
|
|
22.07.2022, 21:17 | 56 |
Croessmah, первая строчка объявляет оператор копирования , а вторая оператор присваивания ? правильно?
0
|
3 / 3 / 0
Регистрация: 14.07.2012
Сообщений: 86
|
|
22.07.2022, 21:18 | 58 |
0
|
22.07.2022, 21:18 | |
22.07.2022, 21:18 | |
Помогаю со студенческими работами здесь
58
Как запретить копирование текста из RichtextBox в буфер обмена? Как запретить заход одного объекта на другой? Как запретить создание объекта в таком случае Как запретить использование метода из объекта класса, содержащегося в классе? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |