Я тоже слышал, что использовать лучше локальные переменные, но никак не пойму, как отказаться от глобальных в приложении, в котором есть некоторый блок (модуль, функция, блок в программе), который «держит» основные переменные, необходимые всем функциям?
Обычно говорят — не используйте глобальные. Но как, если в мэйне я диалогом забираю в переменную имя файла, а потом это имя должны модифицировать отдельные части программы?
А так я делаю глобальной QString inputfile и одна часть программы заполнит её каким-то именем из диалога. Вторая подпрограмма изменит расширение файла. Такая переменная должна быть доступна всем. Где не прав новичок? Да, да, еще говорят, что с глобальными вы просто запутаетесь и запишете в переменную не то, что надо. Но позвольте, это в каком надо быть угаре, чтобы в переменную inputfile записать значение прогрессбара, например?
Перенесем пример в реальный мир:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
QString inputfile; void addExtention() { //здесь пара телодвижений по извлечению старого расширения inputfile += "txt"; // "присваиваем" глобальной переменной значение } int main() { inputfile = OpenDialog (.. take source file);// а это изначально присвоенное значение addExtention(); } |
Другая функция (в дополнение):
1 2 3 4 5 6 7 |
void selectCodePage() { extenshn = inputfile .... //здесь пара телодвижений по извлечению ТЕКУЩЕГО расширения (как-будто теперь TXT) if (extenshn == "txt") { setPage=1251;// ну, предположим, здесь строку оставили в покое, но она все же доступна! } } |
С префиксом «g_» придумано классно, теперь так буду использовать 🙂 Это был промежуточный вопрос.
Второй – по делу. Программирую в Qt Creator. На форме кнопочка, label и lineEdit. В лайнэдит вносится текст, который попадает в переменную str. Эта переменная находится в простейшем классе simple_cl, где глобально или локально она объявляется. Больше ничего в классе нет (кроме конструктора — simple_cl()). Кнопка на форме вызывает диалог — новое окно (дочернее?) программы с помощью dialog_1.exec() в котором также имеется lineEdit по клику (selection done) инфа из него передается в класс simple_cl. И дальше мы работаем как обычно, т.е. в mainwindow.cpp код выглядит так:
1 2 3 |
simple_cl.str = ui->lineEdit->text(); dialog_1.exec() ui->label->setText(simple_cl.str); |
Не могу ничего сделать. В хедере майнуиндоу есть инклюд класса и в диалоге есть такой же. Т.е. они «в курсе» переменой str. В пределах диалога в класс все пишется, при возвращении в mainwindow.cpp — по нулям. Все казалось бы просто, но не знаю как сделать класс и его члены глобальными, чтобы «все» могли с ним работать.
Умники советовали сигналы-слоты, но забивать саморезы в доску вместо гвоздей не хотелось бы (да, оно работает, я проверял). Не поверю, что в С++ нельзя элементарно из одного .cpp файла передать информацию в другой .cpp. Другие советовали использовать extern (extern QString str;)
, но это вроде тоже костыль. Класс для того и создается, чтобы все могли им пользоваться, так?
У меня есть мысли насчет указателей. Например весь класс как указатель. Я передаю адрес класса диалогу &simple_cl — типа пожалуйста, пользуйся. Вылетают ошибки. В этом я не силен. Кто-то подсказывает создать один главный класс и еще пару подклассов для мэйнуиндоу и для диаложного .cpp и типа функции работают со своими подклассами, которые в итоге передают инфу в главный класс, но я тоже не очень понял как реализовать.
Буду благодарен за советы.
Спасибо. Решение должно быть простым, как если бы вы использовали реестр ОС.
"mainwindow.cpp"
"dialog.cpp"
Все предельно просто, компактный и понятный код.
Отдельные личности на форумах вообще предлагают сохранять переменные в файл,
чтобы в диалоге их прочитать и позже вернуть туда результаты работы))))
На SSD прокатит, но это тоже дебильные способы, включая мой.
Создай класс шины. в нем простые функции сетеры-гетеры. и напиши синглтон. получай доступ через него. и будет тебе счастье. пример такой. в классе Шина есть функция сетер например сетЛогин(стд::стринг стр) в которой стр присваивается к приватной переменной стд::стринг м_логин. и есть функция которая возвращает эту прватную переменную например гетЛогин() {ретурн м_логин;}. в одном цпп файле передаешь строку в сет фунцию в другом цпп чтобы получить эту строку вызываешь гет функцию. вот и все! все просто и без сигналов слотов