Задать вопрос
  • Как в C++ скрыть определение вспомогательных типов?

    @MarkusD Куратор тега C++
    все время мелю чепуху :)
    В целом, твой вопрос не имеет точного ответа, т.к. вопрос затрагивает темы вкуса цветных карандашей и просто является риторическим.

    Помимо всей этой воды, что я ниже изложил, еще очень стоит ознакомиться с разделом "SF: Source files" официального гайдлайна:
    https://github.com/isocpp/CppCoreGuidelines/blob/m...
    (Очень советую изучить весь гайдлайн от корки до корки)

    По первому вопросу, коротко: если тип используется по значению - полное объявление типа обязательно, иначе можно обойтись Forward declaration.

    Немного подробнее:

    Существует такой принцип формирования проекта, когда каждый заголовочный файл предоставляет полную информацию о зависимостях. Forward declaration в таком случае или запрещено, или сильно порицается. Каждый заголовочный файл должен обязательно включать в себя заголовочные файлы всех зависимостей. А файл исходного кода должен включать ровно один заголовок - тот, чей интерфейс реализуется в исходном коде.
    Это позволяет сразу видеть все зависимости кода, не париться с размещением файлов, не париться с транзитивными зависимостями, просто не париться, а так же существенно огребать на времени компиляции. Особенно если в проекте разрешен только #include "", а #include <> порицается.
    В качестве примера можно почитать UE4.

    Существует и другой принцип формирования проекта, когда файловая структура отражает макроуровень архитектуры проекта. Скажем, если проект базируется на подсистемах или слоях, каждый слой(подсистема) представляется ровно одним заголовочным мастер-файлом и своей отдельной папкой в файловой системе. Внутри этой папки расположены все внутренние заголовочные файлы подсистемы. Ни один внутренний заголовочный файл не содержит никаких зависимостей, только объявление своего интерфейса. Все зависимости (FD, другие подсистемы или слои, системные заголовки и.т.д.) описывает только мастер-файл, он же в нужной последовательности подключает все внутренние заголовки. Другие подсистемы, равно как и исходный код самой подсистемы, включают в себя только мастер-файл.
    Это позволяет снять всю шелуху с внутренних заголовков и сосредоточить их текст ровно на декларации интерфейса. С другой стороны, ради использования какого-нибудь мелкого типчика всегда приходится подключать всю подсистему, т.к. внутренние заголовки подключать нельзя по правилам формирования проекта и потому что их зависимости неясны.

    В обоих принципах применяется одно очень важное правило: Один класс - один комплект исходного кода с именем самого класса. Это, можно сказать, самый базовый принцип формирования проектов. Классы с инвариантом и богатым функционалом должны быть объявлены каждый в своем отдельном заголовке, имеющим имя класса. Описание функционала каждого такого класса должно лежать в своем отдельном файле исходного кода с именем описываемого класса. Иногда и вовсе требуется несколько файлов исходного кода на один класс, потому что класс выполняет слишком много функций, но разделять его нельзя.
    Этот принцип нередко приводит к проблеме циклической зависимости, когда два класса ссылаются друг на друга и в каждом заголовке необходимо включение второго заголовка. В этом случае помогает или редизайн классов для ослабления зависимостей, или Forward declaration как меньшее из зол.

    С точки зрения компилятора есть только один формат файла - формат исходного кода, который ему и надо обработать.
    С точки зрения человека форматов файла не два, а 3 или 4:
    • .c , .cc , .cxx , .cpp , c++ - формат исходного кода, в котором стоит производить определение интерфейсов и держать все приватные инструменты (код и типы);
    • .h , .hh , .hpp - формат заголовка, в котором подключаются заголовки зависимостей и объявляется интерфейс - ровно то, что может понадобиться в другом коде или не может быть определено в файле исходного кода. И ничего больше;
    • .inl - формат вспомогательного заголовка, в котором производится определение inline функций и сложных шаблонных конструкций;
    • .inc - формат вспомогательного заголовка, в котором описываются форварды, внешние глобальные переменные, константы и прочие данные. Этот формат используется реже всего. Вместо него чаще используют формат заголовка (.h), размещая в нем весь контент .inc файла.


    Если с "человеческими форматами" все должно быть хорошо понятно, то с форматом файла для компилятора стоит уяснить одну тонкость - все эти человеческие шахматы с бубнами и делением на файлы должны складываться в как можно более удобный для компиляции вид. Чем меньше одинаковых #include, тем лучше. Чем меньше #include в целом, тем лучше. Трансляция - дело итак нелегкое.
    Ответ написан
    Комментировать
  • [dotnet core] Как на Linux для c# проекта устанавливать зависимости?

    @SZolotov
    Asp.net core, MAUI,WPF,Qt, Avalonia
    Есть зависимости проекта, а есть зависимости пакета для распространения приложения (например, *.deb). Разработка и сборка приложения зависит от nugget-пакетов. В Linux стандартный способ установки приложений с помощью пакетных менеджеров (теже apt и yum например). Установочный пакет может ссылаться на другие пакеты из удалённого репозитория. Грубо говоря при создании пакета с вашим приложением, в зависимостях пакета можно указать dot net core. Тогда при установки пакета с вашим приложением система может подтянуть dot.net coreю Вот так будет правильно. Другое дело что скорее всего dot net core нет в репозиториях дистрибутивов линукса, вот на red hat есть, а на debian - скорее всего нет.
    Не думаю что nugget-пакеты будут распространяться через стандартные репозитории пакетов какого-либо дистрибутива.
    Ответ написан
    Комментировать
  • Зачем в 32 разрядной виндовс существует ограничение в 4 гб?

    @evgeniy_lm
    потому что 32 бита может адресовать 2^32=4294967296 байт памяти, а это и есть 4Гб. Ни каких других ограничений в этом плане не существует. Ваша фраза (впрочем как и вся табличка ) полный бред
    Искусственные ограничения есть в х64. В реале 64 бит адресуют 17179869184 Гб, согласно закона Мура такой объем памяти в бытовых компьютерах появится примерно через 50 лет
    Ответ написан
    Комментировать
  • Зачем в 32 разрядной виндовс существует ограничение в 4 гб?

    urtow
    @urtow
    *nix, python, QA, bagpipe, folk music
    На самом деле видит, но использовать не может. 32-х разрядные клиентские операционные системы Windows в принципе не могут адресовать более 4-х ГигаБайт.

    Это ограничение в целом для 32 бит, на вики написан судя по всему бред.

    UPD: Бред несу я, читаем про PAE, как мне правильно подсказали
    Ответ написан
    2 комментария
  • Как учиться новому после рабочего дня?

    @Jony1337
    0. Приходи домой и поспи 1-2 ч .
    1. После этого прими душ чтобы проснутся .
    2. В первый день этого режима вас будет тянуть в сон но не надо спать .
    3. Занимайтесь 1-2 ч . не больше толку не будет .
    4. через 2-3 недель вы уже привыкните к этому режиму.
    ps1. В других ответах есть про спорт + поддерживаю их .
    ps2. У вас должна быть сильная мотивация , если её поддерживать всё у вас получится .
    Удачи вам !
    Ответ написан
    Комментировать
  • Максимальное количество строк файле, для нормального его чтения?

    @d1skort
    junior
    Всё что тебе нужно это:
    with open("log.txt") as infile:
        for line in infile:
            do_something_with(line)

    Читаем по одной строке, не загружая весь файл в память.
    Ответ написан
    2 комментария
  • Как запретить показывать случайный домен?

    POS_troi
    @POS_troi
    СадоМазо Админ, флудер, троль.
    Настройте на сервере "default_server" и там повесьте заглушку.
    Ответ написан
    Комментировать
  • Как вернуть значение и закрыть файл?

    sergey-gornostaev
    @sergey-gornostaev Куратор тега Python
    Седой и строгий
    Зачем? Используйте контекст:
    def get_name(self,id):
        with shelve.open("file.shv") as db:
            return db[id].get('file_path')
    Ответ написан
    5 комментариев
  • Как обосновать свой дизайн?

    > Некоторые говорят, что UX'у научиться нельзя, это опыт, анализ и интуиция.
    Во-первых, неправильно некоторые говорят, а во-вторых, получить опыт и научиться анализировать как раз очень даже можно.
    А вы, простите, кроме мнения тех, кто говорит, что всё тлен и высокое искусство, какими-то ещё источниками пользовались, прежде чем сюда идти? Ну там, реальные книжки почитать и всё такое?
    Ответ написан
    Комментировать
  • Существуют ли (желательно в России) свитчи, которые можно запитать от poe?

    plin2s
    @plin2s
    IT, инженер
    Не легче ли сделать нормальную проводную разводку по помещению?
    Ответ написан
    3 комментария
  • Как заработать на blade сервере (или по крайней мере не уходить в минус)?

    athacker
    @athacker
    Монетизировать -- вряд ли удастся. Сам по себе блейд -- это ни о чём. Для продажи чего-то на этих мощностях нужна будет обвязка -- сети, коммутаторы и пр.

    Для пользы человечеству -- поставьте где-нибудь в чулане-подвале, и подключите все лезвия в BOINC, на любой из понравившихся проектов. Либо отдайте в доступ команде FreeBSD под сборку/автотесты.
    Ответ написан
    1 комментарий
  • Где рисовать дизайн этикетки?

    Chipr
    @Chipr
    UX/UI designer
    Всегда все, что уйдет в печать, делаю в векторе.
    Ответ написан
    Комментировать
  • Как лучше реализовать БД?

    @Nc_Soft
    В одну таблицу, это же одна сущность.
    Ответ написан
    5 комментариев
  • Мигает экран Windows 10. Слежка?

    saboteur_kiev
    @saboteur_kiev Куратор тега Windows
    software engineer
    Многие жалуются на репортинг сервис в винде.
    Отключите эти службы, любым способом, например как на видяшке.

    https://www.youtube.com/watch?v=x8xwH-juaCg
    Ответ написан
    Комментировать
  • Выбрать web framework или "велосипедить"?

    Велосипедить имеет смысл только если у вас очень специфичный проект. В остальных случаях берите gin и не парьтесь. Подходит и для крупных и для мелких сайтов.
    Ответ написан
    2 комментария
  • Почему не срабатывает перевод verbose_name для приложений пакета django-allauth, устанавливленного через pip?

    ri_gilfanov
    @ri_gilfanov Автор вопроса
    Web- and desktop-developer
    В файлах локализации с расширением .po, часть переведённых строк имеет пометку нечёткий перевод:
    #, fuzzy
    И игнорируется при компиляции файлов с расширением .mo

    Если нечёткий перевод устраивает больше, чем английский оригинал -- русскую локализацию можно перекомпилировать и с использованием fuzzy-строк:
    python3 manage.py compilemessages --use-fuzzy --locale=ru

    или так:
    python3 manage.py compilemessages -f -l ru

    Результат:
    3de85ce26c9744b9a0de75612755eeab.png

    Благодарю sim3x за точную ссылку в документации.
    Ответ написан
    Комментировать