Forger 22 25 июня Опубликовано 25 июня · Жалоба 1 minute ago, Arlleex said: А это прям C++ или какое-то специальное расширение для компилятора? конечно плюсы, просто я не помню с какого года стандарта 2 minutes ago, Arlleex said: P.S. Неа... В кейле вот не работает(( а у меня в кейле прекрасно работает, C++17, тут он полностью поддержан (компилятор v6.22) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 172 25 июня Опубликовано 25 июня · Жалоба 1 минуту назад, Forger сказал: конечно плюсы, просто я не помню с какого года стандарта а у меня в кейле прекрасно работает, C++17, тут он полностью поддержан (компилятор v6.22) Ну вот прям щас в редакторе написал строчку class A final { public: int a; }; A a; И нет ошибок компиляции(( Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Forger 22 25 июня Опубликовано 25 июня · Жалоба 3 minutes ago, Arlleex said: Ну вот прям щас в редакторе написал строчку class A final { public: int a; }; A a; И нет ошибок компиляции(( final - это защита от наследования, а для защиты от создания экземпляров нужно сделать конструктор приватным добавить всего одну строчку: class A final { A() {} public: int a; }; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 172 25 июня Опубликовано 25 июня · Жалоба 1 минуту назад, Forger сказал: final - это защита от наследования, а для защиты от создания экземпляров нужно сделать конструктор приватным Понятно. Вот если бы еще и конструктор не нужен был бы, было бы идеально)) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Forger 22 25 июня Опубликовано 25 июня · Жалоба Just now, Arlleex said: Вот если бы еще и конструктор не нужен был бы, было бы идеально)) ну не бывает совершенных языков, который полностью всех устраивают )) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 172 25 июня Опубликовано 25 июня · Жалоба 2 минуты назад, Forger сказал: ну не бывает совершенных языков, который полностью всех устраивают )) Видимо так появляются "ща я напишу свой язык программирования"😃 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
razrab83 21 26 июня Опубликовано 26 июня · Жалоба 7 часов назад, Arlleex сказал: Понятно. Вот если бы еще и конструктор не нужен был бы, было бы идеально)) class A final { public: A() = delete; // Удаляем конструктор по умолчанию private: int a; } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
juvf 17 26 июня Опубликовано 26 июня · Жалоба если класс объявлен как final public и удалить конструктор по умолчанию и явно не определить конструкторы копирования и перемещения, компилятор создаст их автоматически в public. Чтобы гарантированно нельзя было создать объект класса - удалите эти конструкторы. class A final { public: A() = delete; // Удаляем конструктор по умолчанию A(const A&) = delete; A(A&&) = delete; A& operator=(const A&) = delete; A& operator=(A&&) = delete; private: int a; } лучше объявить класс как final private, тогда все неявные конструкторы по умолчанию будут также private Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 172 26 июня Опубликовано 26 июня · Жалоба 2 часа назад, razrab83 сказал: class A final { public: A() = delete; // Удаляем конструктор по умолчанию private: int a; } 2 часа назад, juvf сказал: если класс объявлен как final public и удалить конструктор по умолчанию и явно не определить конструкторы копирования и перемещения, компилятор создаст их автоматически в public. Чтобы гарантированно нельзя было создать объект класса - удалите эти конструкторы. class A final { public: A() = delete; // Удаляем конструктор по умолчанию A(const A&) = delete; A(A&&) = delete; A& operator=(const A&) = delete; A& operator=(A&&) = delete; private: int a; } лучше объявить класс как final private, тогда все неявные конструкторы по умолчанию будут также private Ну вот, о чем я и говорил - вместо одного маленького ключевого слова в C++ приходится написать еще горсть визуального мусора, который с течением времени еще поди разберись, на кой был написан... Что за final private? У меня компилятор вообще такое не понимает и ругается на неизвестный синтаксис. Я пока что просто в приватной области класса написал class MyClass final { public: ... private: MyClass(); }; В чем недостатки такой записи? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
juvf 17 26 июня Опубликовано 26 июня · Жалоба В 26.06.2024 в 10:25, Arlleex сказал: В чем недостатки такой записи? я не вижу недостатков. я вижу финальный класс, у которого ЕСТЬ приватный конструктор. Т.е. объект этого класса всё таки можно создать (самим классом). Если объявить класс как final privat и удалить конструктор class MyClass final { public: ... private: MyClass() = delete; }; тут я вижу: 1) от этого класса нельзя наследосаться. 2) нельзя создать объект этого класса. Т.е. не то что пользователь не сможет сделать MyClass obj;, но и не существует ни каких методов в этом классе, чтобы создать объект этого класса, т.е. нет ни каких статический функций (как в синглтоне), аля MyClass *MyClass::create(){return new MyClass); нет. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Forger 22 26 июня Опубликовано 26 июня · Жалоба 26 minutes ago, Arlleex said: Ну вот, о чем я и говорил - вместо одного маленького ключевого слова не надо все это, просто поместите конструктор в секцию private и там же реализуйте, выше же пример: class A final { A() {} public: int a; }; этого вполне достаточно, чтобы заблокировать создание экземпляров этого класса кстати, чатгпт именно это и советует )) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
razrab83 21 26 июня Опубликовано 26 июня · Жалоба 1 минуту назад, juvf сказал: но и не существует ни каких методов в этом классе, чтобы создать объект этого класса, т.е. нет ни каких статический функций (как в синглтоне), аля MyClass *MyClass::create(){return new MyClass); нет если среди горсть визуального мусора нету какого нибудь др. конструтора, например MyClass(int index); Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
juvf 17 26 июня Опубликовано 26 июня · Жалоба В 26.06.2024 в 10:25, Arlleex сказал: Что за final private? class A final{pivate: A();} - класс А объявлен как final private class A final{public: A();} - класс А объявлен как final public имхо Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 172 26 июня Опубликовано 26 июня · Жалоба 2 минуты назад, juvf сказал: class A final{pivate: A();} - класс А объявлен как final private class A final{public: A();} - класс А объявлен как final public имхо А. Ясно)) Ну вот я перенес конструктор в приватную область и удалил его. А нужны ли те самые конструкторы (оставшиеся) тоже для удаления? Ну то есть "обязательно ли" их тоже надо явно удалять? Ведь не имея возможности изначально создать объект, невозможно каким-то образом использовать конструктор копирования/перемещения, а также копирующие/перемещающие присваивания. Разве нет? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Forger 22 26 июня Опубликовано 26 июня · Жалоба 44 minutes ago, juvf said: class A final{pivate: A();} можно вообще убрать слово private, т.к. у классов по-умолчанию все приватное, в отличие от структур, где все по-умолчанию как раз public (кстати, это их единственное отличие, все остальное работает точно так же )) class A final{A() {}}; главное - не забыть ";" в конце )) 42 minutes ago, Arlleex said: невозможно каким-то образом использовать конструктор копирования/перемещения скорее всего нет, задача то довольно необычная. Кстати, а для чего такое вообще нужно? в смысле создавать такой наглухо забитый класс, который нельзя ни наследовать ни создавать )) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться