Перейти к содержанию
    

Плавный переход C -> C++ под МК

1 minute ago, Arlleex said:

А это прям C++ или какое-то специальное расширение для компилятора?

конечно плюсы, просто я не помню с какого года стандарта

2 minutes ago, Arlleex said:

P.S. Неа... В кейле вот не работает((

а у меня в кейле прекрасно работает, C++17, тут он полностью поддержан (компилятор v6.22)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 минуту назад, Forger сказал:

конечно плюсы, просто я не помню с какого года стандарта

а у меня в кейле прекрасно работает, C++17, тут он полностью поддержан (компилятор v6.22)

Ну вот прям щас в редакторе написал строчку

class A final {
  public:
  int a;
};

A a;


И нет ошибок компиляции((

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

3 minutes ago, Arlleex said:

Ну вот прям щас в редакторе написал строчку

class A final {
  public:
  int a;
};

A a;


И нет ошибок компиляции((

final - это защита от наследования, а для защиты от создания экземпляров нужно сделать конструктор приватным

добавить всего одну строчку:

class A final {
	A() {}
public:
  int a;
};

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 минуту назад, Forger сказал:

final - это защита от наследования, а для защиты от создания экземпляров нужно сделать конструктор приватным

Понятно. Вот если бы еще и конструктор не нужен был бы, было бы идеально))

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Just now, Arlleex said:

Вот если бы еще и конструктор не нужен был бы, было бы идеально))

ну не бывает совершенных языков, который полностью всех устраивают ))

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 минуты назад, Forger сказал:

ну не бывает совершенных языков, который полностью всех устраивают ))

Видимо так появляются "ща я напишу свой язык программирования"😃

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

7 часов назад, Arlleex сказал:

Понятно. Вот если бы еще и конструктор не нужен был бы, было бы идеально))

class A final 
{ 
public:	
	A() = delete; // Удаляем конструктор по умолчанию

private: 
	int a; 
}

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

если класс объявлен как 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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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++ приходится написать еще горсть визуального мусора, который с течением времени еще поди разберись, на кой был написан...:boredom:

Что за final private? У меня компилятор вообще такое не понимает и ругается на неизвестный синтаксис.

 

Я пока что просто в приватной области класса написал

class MyClass final {
  public:
    ...
  
  private:
    MyClass();
};


В чем недостатки такой записи?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В 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); нет.  

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

26 minutes ago, Arlleex said:

Ну вот, о чем я и говорил - вместо одного маленького ключевого слова

не надо все это, просто поместите конструктор в секцию private и там же реализуйте, выше же пример:

class A final {
	A() {}
public:
  int a;
};

 

этого вполне достаточно, чтобы заблокировать создание экземпляров этого класса

 

кстати, чатгпт именно это и советует ))

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 минуту назад, juvf сказал:

но и не существует ни каких методов в этом классе, чтобы создать объект этого класса, т.е. нет ни каких статический функций (как в синглтоне), аля MyClass *MyClass::create(){return new MyClass); нет

если среди горсть визуального мусора нету какого нибудь др. конструтора, например MyClass(int index);

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В 26.06.2024 в 10:25, Arlleex сказал:

Что за final private?

class A final{pivate: A();} - класс А объявлен как  final private

class A final{public: A();} - класс А объявлен как  final public

имхо

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 минуты назад, juvf сказал:

class A final{pivate: A();} - класс А объявлен как  final private

class A final{public: A();} - класс А объявлен как  final public

имхо

А. Ясно))

Ну вот я перенес конструктор в приватную область и удалил его.

А нужны ли те самые конструкторы (оставшиеся) тоже для удаления? Ну то есть "обязательно ли" их тоже надо явно удалять?

Ведь не имея возможности изначально создать объект, невозможно каким-то образом использовать конструктор копирования/перемещения, а также копирующие/перемещающие присваивания. Разве нет?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

44 minutes ago, juvf said:

class A final{pivate: A();}

можно вообще убрать слово private, т.к. у классов по-умолчанию все приватное, в отличие от структур, где все по-умолчанию как раз public (кстати, это их единственное отличие, все остальное работает точно так же ))

class A final{A() {}};

главное - не забыть ";" в конце ))

 

42 minutes ago, Arlleex said:

невозможно каким-то образом использовать конструктор копирования/перемещения

скорее всего нет, задача то довольно необычная. Кстати, а для чего такое вообще нужно? в смысле создавать такой наглухо забитый класс, который нельзя ни наследовать ни создавать ))

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...