LINUX.ORG.RU

[c++] [дурацкий вопрос из-за взрывающегося мозга] как сделать изящно?

 


0

1
class SetBlocksTemperatureCommand : public QUndoCommand
{
public:
    SetBlocksTemperatureCommand(const QList<Block *> &blocks, double temperature,
                               QUndoCommand *parent = 0);
    void undo();
    void redo();
    
private:
    struct BlockWithOldTemperature {
        BlockWithOldTemperature(Block *block, double new_temperature);
        void restoreTemperature() {
                m_block->m_temperature = m_old_t;
        }
        void applyTemperature() {
                m_block->m_temperature = m_new_t;
        }
    private:
        Block *const m_block;
        const double m_old_t;
        const double m_new_t; //хрень :(
    };
    QList<BlockWithOldTemperature> m_blocks;
    double m_temperature;
};

А теперь, собственно, вопрос. Поле m_new_t будет одинаково для всех экземпляров класса BlockWithOldTemperature, созданных в одном и том же экземпляре класса SetBlocksTemperatureCommand (так просто получится по реализации). Возможно ли как-то сэкономить память и не класть в каждый экземпляр BlockWithOldTemperature по лишнему double'у?

★★★★★

Последнее исправление: Obey-Kun (всего исправлений: 1)

Пока в голову лезет 2 способа, оба корявые:

1. Хранить в каждом экземпляре BlockWithOldTemperature указатель на «родителя», откуда при необходимости брать m_temperature. Плохо, т.к. всё равно тратится лишняя память — на хранение указателя. Плюс придётся обращаться к экземпляру другого класса по указателю каждый раз, когда нужна температура, а это занимает время.
2. Передавать температуру и в конструктор BlockWithOldTemperature, и (каждый раз) в метод applyTemperature (добавив в этот метод новый аргумент — double temperature). Но это идиотство я даже комментировать не буду, т.к. оно идиотское.

Ну же, должно же быть что-то изящнее.

Obey-Kun ★★★★★
() автор топика
Ответ на: комментарий от Obey-Kun

Я смотрел без большого напряга, но в классе BlockWithOldTemperature я и так не вижу никакого дабла (-;

kiverattes ★☆
()

Интересно, а насколько реально хранить разницу температур, а не старое и новое значение.

Мне кажется, что экономия лишнего double, это не то, на чем надо заострять внимание. Тут надо быть осторожным с самим механизмом Undo/Redo. У меня такое ощущение, что твоем коде легко что-нибудь накосячить.

pathfinder ★★★★
()
Ответ на: комментарий от anonymous

Ну да, это эквивалентно первому способу ОПа, понятно же, что ничего лучше здесь сделать нельзя. ОП просил «изящно» - я и предложил, как сделать изящно с минимальными издержками производительности.

anonymous
()

Расслабься, лучшее - враг хорошего, нельзя здесь сэкономить (я серьезно)

dt1 ★★
()

> [c++]

сделать изящно

Ну ты понял.

anonymous
()
Ответ на: комментарий от pathfinder

Мне кажется, что экономия лишнего double, это не то, на чем надо заострять внимание. Тут надо быть осторожным с самим механизмом Undo/Redo. У меня такое ощущение, что твоем коде легко что-нибудь накосячить.

Тут всё очень просто. Не знаю, где можно накосячить. Сама архитектура Qt очень проста для написания Undo/Redo (если ты не заметил, тут используется стандартный класс Qt). Вообще, я изначально вообще хотел сделать такое:

struct BlockWithOldTemperature {
        Block *const block;
        const double old_t;
}

И не совать туда никаких методов, а просто отдельно описать их в ф-циях undo() и redo().

Но потом оказалось, что к каждой ячейке должен быть персональный подход в undo (и унифицированный в redo). И я на воспалённый мозг решил, что у BlockWithOldTemperature надо запихать все поля в private, и всё работу там осуществлять двумя методами. Но это корявый в данном случае подход.

Короче, сделаю просто. В структуре BlockWithOldTemperature члены не буду пихать в private, а все методы уберу, останется только конструктор. И обработчики напишу в методах undo и redo SetBlocksTemperatureCommand. Как-то так.

Это не супер-тип, чтобы заботится об инкапсуляции и т.п.

Obey-Kun ★★★★★
() автор топика
Ответ на: комментарий от JackYF

Так оно static будет на все экземпляры данного класса, а нужно только на экземпляры, созданные внутри одного экземпляра SetBlocksTemperatureCommand. Или я неправильно понимаю суть static?

Obey-Kun ★★★★★
() автор топика
Ответ на: комментарий от Obey-Kun

А, пардон, плохо прочитал условие задачи.

JackYF ★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.