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

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

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

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

присоединяюсь к вопросу. сущность класса - наследование, полиморфизм. Если его зафиналить и закупорить, все методы в статик - то можно всё сделать без класса. данные, функции... для нэймспейсинга использовать namespace. 

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

можно вообще убрать слово private

не очень хорошая идея. это "неявное". Когда ЯВНО указан private - это явно указан private . а когда его нет - он явно не указан или его забыли?

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


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

10 minutes ago, razrab83 said:

е очень хорошая идея. это "неявное".

это как раз явное, т.к. жестко прописано в стандарте со времен царя гороха )

Впрочем, это больше для тех, кто желает абсолютного минимализма.

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

 

12 minutes ago, razrab83 said:

а когда его нет - он явно не указан или его забыли?

нет, я как раз активно использую такую особенность (все поля/методы по умолчанию приватные), это немного но сокращает объем кода, как минимум описание класса не выглядит таким громозким. Но это вкусовщина, 100%

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


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

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

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


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

В 26.06.2024 в 12:04, Forger сказал:

это как раз явное, т.к. жестко прописано в стандарте со времен царя гороха )

это называется "неявное". Со времён царя гороха в стандарте с++ говорится, что по умолчанию будет приват. "по умолчанию" - читай "при неявном" ("по умолчанию" - значит когда "нет явного указания"). Более того, в с++14

Цитата

Members of a class defined with the `class` key have private access by default; members of a class defined with the `struct` key have public access by default. Access specifiers can be provided explicitly.

 

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


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

23 minutes ago, juvf said:

это называется "неявное".

хорошо, пусть "неявное", хотя это скорее вопрос терминологии ))

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


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

Класс (а не нэймспейс) тут в первую очередь для создания классовой области видимости идентификаторов (чтобы можно было спокойно сначала визуально отделить public-функции, и потом в конце уже приватные потроха), а также для того, чтобы скрыть всякие вспомогательные штуки в приватном "хвосте" класса. Для явного использования они будут недоступны.

Мне нужен лишь интерфейс (набор функций), который представлен хедером. Без какой-то конкретики - конкретика в *.cpp, который я могу, ежели что, скомпилить в библиотеку и отдать на сторону.

P.S. Я в классе всегда сначала специфицирую публичную часть, потому что при чтении класса как правило надо видеть его интерфейс. Приватные потроха сбрасываю в конец класса под приватным селектором.

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


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

13 minutes ago, Arlleex said:

Приватные потроха сбрасываю в конец класса под приватным селектором.

если речь про класс-синглтон, ну где по сути все статик, то всю приватную шелуху можно разместить прямо в начале cpp, дополнив static, чтобы никто не использовал это извне.

Тогда интерфейс такого класса выглядит "чистым", а вся приватная "шелуха" спрятана там, где ее никому не нужно видеть, например:

// Communication.hpp

class Communication : public Module
{
public:
	Communication() { name = const_cast<char*>("Communication"); }

	static struct Signal
	{
		struct
		{
			Delegate<bool(SensorIndex)> isActive;
		} digitalInputs;

		struct
		{
			Delegate<void(ChannelIndex)> on;
			Delegate<void(ChannelIndex)> off;
		} digitalOutputs;

		struct
		{
			Delegate<Voltage()> 	getMainValveVoltage;
		} analogInputs;

	} signal;

	static Communication & getInstance();
};

 

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


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

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

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

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

теплоламповый Eclipse знает

image.thumb.png.5f90f2f8bdaa5feaefda5d420f71d62c.png

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


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

4 minutes ago, razrab83 said:

теплоламповый Eclipse знает

эклипс это просто оболочка, впрочем как и кейл, хотя с последним кейлом идет в комплекте свежий шестой компилятор по-умолчанию, он как раз и держит новые фичи

Достаточно подключить современные компиляторы к этим оболочкам с нужными ключами и код будет компилироваться аналогично в обоих оболочках

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


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

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

эклипс это просто оболочка, впрочем как и кейл

Это ваш кеил - просто оболочка ))

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

и код будет компилироваться аналогично

я не про это. в Eclipse, в визарде создания класса есть эти фичи. От компилятора визрад эклипса не зависит. Можно гуями все эти delete, приваты и final-ы настроить, В визарде QtCreator этого нет. в VSCode я тоже не замечал. в Кейле не знаю. 

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


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

22 minutes ago, razrab83 said:

В визарде QtCreator этого нет. в VSCode я тоже не замечал. в Кейле не знаю. 

в кейле тоже нет, а разве это так необходимо?

я например просто копирую целиком классы без всяких визардов, а что нужно меняю или дополняю

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


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

2 часа назад, Forger сказал:

Тогда интерфейс такого класса выглядит "чистым", а вся приватная "шелуха" спрятана там, где ее никому не нужно видеть, например:

А где она спрятана? В другом классе, который подключается из другого хедера? Так это не спрятана - это просто отведена от глаз - это можно и без синглтонов сделать, да и банально - как я показывал - разделять класс на несколько частей - публичную, в которой презентуется интерфейс класса для взаимодействия с ним, и приватную, в которой находятся все вспомогательные классу вещи.

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


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

9 minutes ago, Arlleex said:

А где она спрятана? В другом классе, который подключается из другого хедера?

Конечно нет ) Иначе будет беда )) повторюсь - в самом cpp файле реализации этого класса, это внутренние static классы или данные, что угодно, к чему нельзя обратиться через extern.

Повторюсь, такое нужно только, если класс синглтон или так называемая "фабрика" классов (т.е. создание объектов через отдельный статик метод).

Во втором случае подразумевается, что макс число объектов класса заранее известно и поэтому под их экземпляры можно заранее выделить место прямо в cpp файле с соотв. припиской static, а "выдавать" ссылки на них через отдельный открытый метод (статический конечно). Про фабрику классов лучше отдельно почитать, это такой паттерн программирования ) Почти не использую.

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


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

2 часа назад, Arlleex сказал:

Приватные потроха сбрасываю в конец класса под приватным селектором.

Между прочим, это - рекомендуемый современный стиль оформления. Раньше было наоборот, приватная секция в начале. Хотя, сам стандарт языка разрешает располагать секции в любом порядке, даже вперемешку, с чередованием.

Однако, привычного из Си понятия "интерфейс" в ++ более не существует, и в классе накидано всё подряд. Именно поэтому современный стиль рекомендует публичную секцию, выполняющую роль интерфейса, располагать в начале списка.

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


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

12 minutes ago, EdgeAligned said:

Между прочим, это - рекомендуемый современный стиль оформления.

Нормальный стиль, все наверняка к нему давно привыкли )

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


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

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

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

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

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

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

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

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

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

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