Политика конфиденциальностиКонтактыО сайтеОтзывыGitHubDonate
© EVILEG 2015-2018
Рекомендует хостинг
TIMEWEB
g
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
L
  • 20 августа 2018 г. 13:18
  • (ред.)
  • Ответ был помечен как решение.

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

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

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

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


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

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

0

Комментарии

Только авторизованные пользователи могут публиковать комментарии.
Пожалуйста, авторизуйтесь или зарегистрируйтесь
IO
20 января 2019 г. 18:39
Ivan Otreshko

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

  • Результат:0баллов,
  • Очки рейтинга-10
IO
20 января 2019 г. 15:27
Ivan Otreshko

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

  • Результат:0баллов,
  • Очки рейтинга-10
v
17 января 2019 г. 11:51
vitalir12

C++ - Тест 004. Указатели, Массивы и Циклы

  • Результат:20баллов,
  • Очки рейтинга-10
Последние комментарии
I
16 января 2019 г. 8:06
IscanderChe

Заработало. Забыл model->select(); вписать.
I
16 января 2019 г. 8:02
IscanderChe

Всё равно пусто, хотя строка с данными в базу добавляется.
16 января 2019 г. 7:51
Евгений Легоцкой

потому, что нужно сохранять информацию для всех остальных ролей и столбцов через вызов переопределённого метода. Да к тому же вы ещё и зациклили вызов метода data. QVariant MySqlTableModel:...
I
16 января 2019 г. 7:43
IscanderChe

Сделал вот так. В tableView ничего нет, кроме заголовка. QVariant MySqlTableModel::data(const QModelIndex &index, int role) const{ if (role == Qt::DisplayRole) { QTime ...
Сейчас обсуждают на форуме
21 января 2019 г. 16:28
Михаиллл

Добрый день.Почему работая на С++, нельзя полноценно использовать dll , написанных на C#, java?И почему используя другие языки, можно использовать dll , написанных на C++?
21 января 2019 г. 16:24
Михаиллл

Нашел ссылку на древние типы данных , а тут нынешние их аналоги.Но все равно каое что непоня:что такое : LPCTSTR, CALLBACK (наверно QDialig),IDOK, EDITSTREAM, TCHARКод...
21 января 2019 г. 14:30
Евгений Легоцкой

Порядок создания тем - пункт 4
ПБ
21 января 2019 г. 9:23
Павел Богдевич

Ребята, привет. Это 2 версии одного приложения. Отличаются только способом инициализации таблицы. В одной версии работает сортировка таблицы, когда кликаешь по хедеру колонки, в другой - нет. ...
21 января 2019 г. 7:36
Евгений Легоцкой

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

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