Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/7: Рейтинг темы: голосов - 7, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 07.07.2013
Сообщений: 14

Несколько mutable bool в классе

16.09.2013, 23:53. Показов 1614. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Приветствую.
Столкнулся с необъяснимой для меня проблемой.
Суть:

Есть класс, пусть будет:
C++
1
2
3
4
5
6
7
8
9
10
11
class test {
mutable bool flag1, flag2, flag3, flag4;
public:
void setflag1(bool flag){ flag1 = flag; }
void setflag2(bool flag){ flag2 = flag; }
void setflag3(bool flag){ flag3 = flag; }
void setflag4(bool flag){ flag4 = flag; }
 
bool enabled(){ return (flag1 && flag2 && flag3 && flag4); }
bool disabled(){ return (!flag1 || !flag2 || !flag3 || !flag4); }
}
Почему mutable - т.к. в других классах есть указатель на список из этого класса, чтоб менять значение флагов.
Флаг - по сути, это правило отображения. Один флаг - один тип фильтра, если элемент класса попадает под любой из фильтров, то он не отображается. По дефолту флаги = true, чтоб "применить" фильтр флаг ставится false( на форме снимается галочка у чекбокса ).

test::disabled() почему-то постоянно возвращает false независимо от значения флагов.
Доходило даже до того, что я писал так:
C++
1
bool disabled(){ return true; }
И из другого класса он всё равно возвращал false! Причём в вижуал студии по брейкпоинту из того класса я смотрел на флаги в элементах и они выставлялись корректно.

Как такое может быть? Сам ума не приложу. Подскажите, пожалуйста.

Добавлено через 9 минут
Чуть не забыл.
Если флаг один, то всё работает как надо.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
16.09.2013, 23:53
Ответы с готовыми решениями:

Как можно диалоговую функцию BOOL __stdcall DialogProc сделать в классе ?
class CDialog { protected: virtual BOOL __stdcall DialogProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { ...

Функция twoTrue :: Bool -> Bool -> Bool -> Bool
Функция twoTrue :: Bool -> Bool -> Bool -> Bool, которая возвращает True тогда и только тогда, когда хотя бы два из трех её аргументов...

Объединить несколько Expression<Func<T, bool>>
Добрый вечер форумчане. Подскажите пожалуйста, как имея два выражения, например Expression&lt;Func&lt;IClaimCheck,...

10
 Аватар для AnyOne697
134 / 106 / 10
Регистрация: 22.05.2010
Сообщений: 533
17.09.2013, 02:23

Не по теме:

- Когда будет конец света?
- Когда люди научаться форматировать программный код.
- Лучше уж конец света!



Не знаю, что у Вас, но у меня всё в порядке.
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
17.09.2013, 13:58
Цитата Сообщение от arsgram Посмотреть сообщение
Если флаг один, то всё работает как надо.
а если
Цитата Сообщение от arsgram Посмотреть сообщение
C++
1
bool disabled(){ return true; }
то всё равно false? Удивительно.
Приведите минимально рабочий пример с ошибкой - посмотрим.

А про mutable Вы видимо что-то не так поняли. Спецификатор mutable позволяет меня значение поля, даже если объект, содержащий это поле, константный.
Для флагов логичнее использовать какой-нибудь std::bitset например.
0
0 / 0 / 0
Регистрация: 07.07.2013
Сообщений: 14
17.09.2013, 16:11  [ТС]
Сейчас покопаюсь в проекте и отпишу.
Код было лень тут пробелами форматировать

Использую mutable, т.к. объекты класса в списке не std'шном, а в QList'е, библиотека Qt. Он все свои элементы списка делает const, поэтому без mutable я не могу изменить что-либо из другого класса.(
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
17.09.2013, 16:23

Не по теме:

Цитата Сообщение от arsgram Посмотреть сообщение
Использую mutable
Используйте QMutableListIterator.


Из-за того, что используете неверный тип итератора все Ваши проблемы, скорее всего, и возникают.
0
0 / 0 / 0
Регистрация: 07.07.2013
Сообщений: 14
17.09.2013, 17:11  [ТС]
Не использовал итератор вообще.

В основном классе объявляется
C++
1
2
QList<baseObject> baseObjects;
//далее список наполняется объектами и всё такое.
Во втором классе есть такая штука:
C++
1
2
3
QList<baseObject> *baseObjects; // Внутри класса указатель
 
void class2::setList(QList<baseObject> *list){ baseObjects = list; }
В основном классе:
C++
1
2
c2 = new class2();
c2->setList(&baseObjects);
Из второго класса пытаюсь менять флаг теперь вот так:
C++
1
2
3
4
5
6
7
8
//Пусть flag == [B]false[/B]
QMutableListIterator<baseObject> i(*baseObjects);
    while (i.hasNext())
    {
        baseObject b = i.next();
        if(b.getValue() > value1 && b.getValue() <= value2) //Пара неких условий
            b.setFlag1(flag);
    }
Смотрю по брейкпоинту, один из флагов становится false, как и надо.
Есть ещё третий класс, у которого точно так же имеется указатель на список объектов. Смотрю оттуда - все флаги true.

К сожалению, выложить проект не могу весь, т.к. на самом деле он большой.
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
17.09.2013, 17:21
Должна быть ссылка. Иначе создается копия элемента.
C++
1
baseObject& b = i.next();
0
0 / 0 / 0
Регистрация: 07.07.2013
Сообщений: 14
17.09.2013, 18:48  [ТС]
Ага, понял.
Сначала ничего не заработало как хотел. Сделал цикл, где проверялось disabled() ли элемент списка тоже итератором.
Всё заработало, но. решил проверить как там и что.
И завис. Как это вообще возможно? глюк вижуалки? Привет из прошлого? У меня раньше был один флаг в классе, но при этом всё работает корректно, как если было бы три флага, да и в коде их тоже три.
Картинка во вложениях.
Миниатюры
Несколько mutable bool в классе  
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
17.09.2013, 19:57
arsgram, точку останова надо ставить на if, и состояние смотреть когда её достигли, а не до входа в цикл.
0
0 / 0 / 0
Регистрация: 07.07.2013
Сообщений: 14
17.09.2013, 22:39  [ТС]
Я так и смотрю, я дальше просто f10 пронажимал, он получил в disabled() true и пошёл на следующую итерацию.
Я не о том.
Внизу, в структуре объекта присутствует переменная flag, причем одна, которую я заменил треям давно, что видно в правой части картинки.
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
17.09.2013, 22:43
Цитата Сообщение от arsgram Посмотреть сообщение
которую я заменил треям давно
Попробуйте сделать очистку проекта с полной пересборкой. А потом посмотрите еще раз.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
17.09.2013, 22:43
Помогаю со студенческими работами здесь

не работает bool xor(bool a, bool b)
Учусь по &quot;Базовому курсу&quot; Герберта Шилда #include &lt;iostream&gt; bool xor(bool a, bool d); int main() { bool p, q; cout...

Несколько структур в классе
Делаю подобие словаря для курсача на основе одноправленного списка с заголовком в VisualStudio 2008. Собственно имеется класс Dictionary, и...

Ошибка приведения типов: E2357 Reference initialized with 'bool', needs lvalue of type 'bool'
Подскажите решение проблемы, программа на rad studio2010, проблема в этой строке ((TScrollBox*)c)-&gt;OnMouseWheel(c,Shift, WheelDelta,...

Несколько асинхронных функций в классе
Ребятушки, я шарпист и я просто фигею от некоторых фич в джаве. Неужели нет возможности сделать две асинхронные функции в классе? Самый...

Изменить значение bool a = true в bool a = false
// Логическое выражения - варианты #include &lt;iostream&gt; #include &lt;conio.h&gt; using namespace std; int main() { ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru