• Издержки полиморфизма или неправильный дизайн?

    @vanyamba-electronics
    union
    {
        char charVal;
        float floatVal;
    } Value;
    
    class Token
    {
        Value m_value;
    public:
        inline Value const* getValue() const {
            return &m_value;
        }
        inline void setValue(Value const* pVal) {
           ::memcpy(&m_value, pVal, sizeof(Value));
        }
    };
    
    class CharToken : public Token
    {
    public:
         CharToken() {}
         inline char getChar() const {
            return m_value.charVal;
         }
    };
    
    class FloatToken : public Token
    {
    public:
         FloatToken() {}
         inline float getFloatValue() const {
            return m_value.floatValue;
         }
    };
    Ответ написан
    Комментировать
  • Издержки полиморфизма или неправильный дизайн?

    1. Не нужно пихать getChar и getFloat в абстрактный класс.
    Но если таки делаешь заглушки - кидай полноценную ошибку, чтобы гарантировать корректное использование.

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

    3. Вместо указателей на классы можно попробовать union - для этого есть std::variant. Это будет чуть более эффективно по памяти, хоть размер массива может вырасти, если вместо float будет double, а вместо char - какой-нибудь wchar или "руна", или если добавится ещё какой-нибудь тяжёлый вариант. А до этого такой Юнион можно уместить в 8 байт вместе с выравниванием.
    Ответ написан
    1 комментарий
  • Издержки полиморфизма или неправильный дизайн?

    @mvv-rus
    Настоящий админ AD и ненастоящий программист
    Простейший способ решить вашу проблему, не нарушая вашу архитектуру - сделать корневой класс иерархии "полуабстрактным": сделать его виртуальные методы не чистыми виртуальными, а реализовать как те самые заглушки, которые вы реализуете в каждом классе-потомке.

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

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Не совсем правильный дизайн. Смысл складывать float и int в одну кучу, если все, что вы с ними делаете - это берете int или float значение.

    В хорошем дизайне у вас какая-нибудь функция print будет. Которая будет соответствующее число красиво, в соответствии с типом, выводить. Или рисовать на экране что-то, или считать что-то.

    Если же вы действительно хотите брать вот такие совершенно разные по смыслу значения у разных наследников, то, да, в интерфейсе должны быть все функции. Можно в интерфейсе их определить с ассертами и переопределить только в нужных наследниках.
    Ответ написан
    1 комментарий
  • Происходит ли нарушение инкапсуляции, если реализация хранится в .h-файлах?

    @dima20155
    you don't choose c++. It chooses you
    Нарушением инкапсуляции это довольно сложно назвать, ибо приватные функции все ещё остаются приватными с точки зрения других классов. Сокрываете вы реализацию методов класса от других сущностей в вашем коде, а не от программиста (если я правильно понял причину по которой вы решили, что это нарушение инкапсуляции).
    Мне нравится метод организации данного кода следущим образом:

    Foo.h
    template <typename T>
    struct Foo
    {
        void doSomething(T param);
    };
    
    #include "Foo_impl.h"


    Foo_impl.h
    template <typename T>
    void Foo<T>::doSomething(T param)
    {
        //implementation
    }


    Код украл отсюда
    https://stackoverflow.com/questions/495021/why-can...
    Ответ написан
    1 комментарий
  • Правильно ли реализовано делигирование конструктора?

    Alexandroppolus
    @Alexandroppolus
    кодир
    Разумеется, должен. Иначе, если объект твоего класса создадут первым конструктором, там будет непонятно что
    Ответ написан
    3 комментария
  • Правильно ли реализовано делигирование конструктора?

    @dima20155
    you don't choose c++. It chooses you
    Если вы хотите, чтобы color и isVertical имели определенные значения - инициализируйте. Компиляторы не гарантируют, что инициализируют целочисленные значения именно нулями (хотя такое часто встречается). По некоторым style гайдам считается плохой практикой объявлять переменные без присвоения им какого-либо значения.
    Ответ написан
    Комментировать
  • Как вызвать метод класса, из другого класса, не создавая при этом экземпляра класса?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Для начала задумайтесь, а зачем вы наследуете все от lk_core? Почитайте про принцип единой ответственности.

    Логично передавать экземпляр класса lk_bans если он у вас отвечает за логику банов в конструктор класса, который его хочет использовать (принцип инверсии зависимостей). И да, опять же. Читаем принцип подстановки барбары Лисков. Родительский класс (lk_core) ничего не должен знать о своих потомках. Вообще ничего.

    Вообще на начальных этапах старайтесь избегать наследования. Вот вообще. И почитайте про SOLID и GRASP. Сразу кучу вопросов для себя покроете.

    Есть подборка того, что должен посмотреть каждый по-ха-пэшник. Там есть и про SOLID и про GRASP и зачем это все надо.
    Ответ написан
    Комментировать
  • Как создать свой центр сертификации ssl и заставить ВСЕ браузеры ему доверять?

    CityCat4
    @CityCat4 Куратор тега Цифровые сертификаты
    //COPY01 EXEC PGM=IEBGENER
    Если есть много-(много) денег - легко. Пишете основным производителям браузеров - вот, я Иван Петров, хочу быть корневым УЦ. Давайте мне ваши требования, деньги на все есть :)
    Вам дают требования, Вы их выполняете.
    ПРОФИТ!

    ЗЫ: Надеюсь, Вы уже поняли, что это был просто стеб. Для обычного человека и даже для обычной организации нереально попасть в списки доверенных УЦ в браузерах. От слова совсем.
    Ответ написан
    Комментировать