Политика конфиденциальностиКонтактыО сайтеОтзывыGitHubDonate
© EVILEG 2015-2018
Рекомендует хостинг
TIMEWEB
20 августа 2018 г. 11:50

Странное поведение сингелтона, а может быть, и не в нем проблема...

Здравствуйте!
Появилась проблема, не знаю, с какой стороны к ней подойти даже, чтобы поискать решение.
Суть в чем. Написал синелтон в двух модулях:
pu.h:
enum class ControlObjectPalette
{
      TreeBase = 0
    , TreeItem
    , TreeItemSelected
    , TreeReady
    ...
};


class PaletteUtils
{
public:
    static PaletteUtils instance();

    /*!
     * \brief По коду цвета возвращает цвет из палитры
     * \param colorCode
     */
    QColor getColor(const Palette &colorCode) const;
    /*!
     * \brief Устанавливает цвет
     * \param colorCode - код цвета
     * \param color - значение цвета
     */
    void setColor(const Palette &colorCode, const QColor &color);


private:
    PaletteUtils();

    QMap<ControlObjectPalette, QColor> m_palette;
};


pu.cpp:
PaletteUtils PaletteUtils::instance()
{
    static PaletteUtils _instance;
    return _instance;
}

QColor PaletteUtils::getColor(const Palette &colorCode) const
{

    if (colorCode == Palette::TreeBase)
        qDebug() << "---->>>>>" << (int)colorCode << m_palette.value(colorCode);
    return m_palette.value(colorCode);
}

void PaletteUtils::setColor(const Palette &colorCode, const QColor &color)
{
    m_palette.insert(colorCode, color);
    if (colorCode == Palette::TreeBase)
        qDebug() << "<<<<<----" << (int)colorCode << m_palette.value(colorCode);
}

PaletteUtils::PaletteUtils()
    :      m_palette({
                       std::pair<Palette, QColor>(Palette::TreeBase, QColor(165, 165, 165))
                     , std::pair<Palette, QColor>(Palette::TreeItem, QColor(183, 232, 221))
                     , std::pair<Palette, QColor>(Palette::TreeItemSelected, QColor(49, 133, 155))
                       ...
                     })
{

}


Все работает, пока я получаю от него данные вот так:
QColor color = PaletteUtils::instance().getColor(code);

Необходимо изменить в нем данные. Вызываю setColor:
PaletteUtils::instance().setColor(code, color);

Данные меняются, вывод из процедуры setColor говорит об этом.
Но, если после выполнения setColor прочитать данные с помощью getColor - данные неизменны. То есть, как бы сделали копию m_palette, поработали в ней и отдали. Отладочный вывод привожу:
---->>>>> 0 QColor(ARGB 1, 0.647059, 0.647059, 0.647059)
---->>>>> 0 QColor(ARGB 1, 0.647059, 0.647059, 0.647059)
<<<<<---- 0 QColor(ARGB 1, 0.647059, 0.309804, 0.529412)
---->>>>> 0 QColor(ARGB 1, 0.647059, 0.647059, 0.647059)

Если вынести m_palette из сингелтона и поместить его в pu.cpp, все работает.
Почему такое происходит, не можете подсказать?
Заранее большое спасибо.

2
  • Ответ был помечен как решение.
  • 20 августа 2018 г. 13:18

Лучше возвращать ссылку на экземпляр класса:

PaletteUtils& PaletteUtils::instance()
{
    static PaletteUtils _instance;
    return _instance;
}

и если уж делать singleton, то хорошо было бы запретить копирование (вынести в приват или пометить delete):

PaletteUtils(const PaletteUtils&) = delete;
PaletteUtils& operator= (const PaletteUtils &) = delete;


0
  • 21 августа 2018 г. 5:21

Спасибо. Все получилось

0

Ответы

Только авторизованные пользователи могут отвечать на форуме.
Пожалуйста, авторизуйтесь или зарегистрируйтесь
18 ноября 2018 г. 19:19
cyrillwork

Qt - Тест 001. Сигналы и слоты

  • Результат:78баллов,
  • Очки рейтинга2
16 ноября 2018 г. 19:09
Илья Завьялов

Qt - Тест 001. Сигналы и слоты

  • Результат:31баллов,
  • Очки рейтинга-10
16 ноября 2018 г. 12:49
Ирина Минигузина

C++ - Тест 003. Условия и циклы

  • Результат:0баллов,
  • Очки рейтинга-10
Последние комментарии
16 ноября 2018 г. 6:50
Евгений Легоцкой

Добрый день! шаблон не находит, или шаблон неправильно прописали, или тег шаблона неправильно написан, иных выводов сделать не могу, из того, что вы написали. трейсбек нужно смотреть. Со...
16 ноября 2018 г. 6:48
Евгений Легоцкой

пройтись циклом по всем виджетам в обратном порядке for (int i = ui->vertialLayout->count() - 1; i >= 0; --i){ QWidget* w = ui->verticalLyout->itemAt(i)->widget();...
15 ноября 2018 г. 21:35
chunk

Доброго времени суток Евгений. Не подскажете что я делаю не так? Получаю ошибку такого характера: Reverse for 'add_comment' with arguments '('',)' not found. 1 pattern(s) tried: ...
15 ноября 2018 г. 15:35
Михаиллл

Спасибо. Похоже где то описку сделал, поэтому не работало. Я добавил на verticalLayout много виджитов. А можно ли их как то быстро и просто удалить?
15 ноября 2018 г. 14:55
Евгений Легоцкой

verticalLayout - это, по-моему предположению, должен быть у вас объект класса QVBoxLayout, который наследован от QBoxLayout. Поэтому открываете документацию на QVBoxLayout ...
Сейчас обсуждают на форуме
18 ноября 2018 г. 18:11
Metelev

Большое спасибо, все получилось, завтра начну изучать код.
18 ноября 2018 г. 17:49
Чарльз Грин

Спасибо, буду разбераться
17 ноября 2018 г. 14:13
Чарльз Грин

Я сейчас занимаюсь мультимедией, это аудио и видео, программы для концертов и т. д. Бибилиотека Qt очень помогает, она надежная, а надежность в моих приложениях очень важный фактор чтоб не пол...
16 ноября 2018 г. 16:28
Евгений Легоцкой

Добрый день! Спасибо, что воспользовались именно форумом. Заниматься курсовыми работами чьими-то ни было у меня времени нет, у самого полторы работы. Но что-то подсказать на фо...
Присоединяйтесь к нам в социальных сетях

Для зарегистрированных пользователей на сайте присутствует минимальное количество рекламы