Вопрос №1: Как отказаться от глобальных переменных в приложении? Программирование в QT Creator

  

  3 Фев 2019

  
  497
  

  2 

Я тоже слышал, что использовать лучше локальные переменные, но никак не пойму, как отказаться от глобальных в приложении, в котором есть некоторый блок (модуль, функция, блок в программе), который «держит» основные переменные, необходимые всем функциям?

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

А так я делаю глобальной QString inputfile и одна часть программы заполнит её каким-то именем из диалога. Вторая подпрограмма изменит расширение файла. Такая переменная должна быть доступна всем. Где не прав новичок? Да, да, еще говорят, что с глобальными вы просто запутаетесь и запишете в переменную не то, что надо. Но позвольте, это в каком надо быть угаре, чтобы в переменную inputfile записать значение прогрессбара, например?

Перенесем пример в реальный мир:

Другая функция (в дополнение):

С префиксом «g_» придумано классно, теперь так буду использовать 🙂 Это был промежуточный вопрос.

Второй – по делу. Программирую в Qt Creator. На форме кнопочка, label и lineEdit. В лайнэдит вносится текст, который попадает в переменную str. Эта переменная находится в простейшем классе simple_cl, где глобально или локально она объявляется. Больше ничего в классе нет (кроме конструктора — simple_cl()). Кнопка на форме вызывает диалог — новое окно (дочернее?) программы с помощью dialog_1.exec() в котором также имеется lineEdit по клику (selection done) инфа из него передается в класс simple_cl. И дальше мы работаем как обычно, т.е. в mainwindow.cpp код выглядит так:

Не могу ничего сделать. В хедере майнуиндоу есть инклюд класса и в диалоге есть такой же. Т.е. они «в курсе» переменой str. В пределах диалога в класс все пишется, при возвращении в mainwindow.cpp — по нулям. Все казалось бы просто, но не знаю как сделать класс и его члены глобальными, чтобы «все» могли с ним работать.

Умники советовали сигналы-слоты, но забивать саморезы в доску вместо гвоздей не хотелось бы (да, оно работает, я проверял). Не поверю, что в С++ нельзя элементарно из одного .cpp файла передать информацию в другой .cpp. Другие советовали использовать extern (extern QString str;), но это вроде тоже костыль. Класс для того и создается, чтобы все могли им пользоваться, так?

У меня есть мысли насчет указателей. Например весь класс как указатель. Я передаю адрес класса диалогу &simple_cl — типа пожалуйста, пользуйся. Вылетают ошибки. В этом я не силен. Кто-то подсказывает создать один главный класс и еще пару подклассов для мэйнуиндоу и для диаложного .cpp и типа функции работают со своими подклассами, которые в итоге передают инфу в главный класс, но я тоже не очень понял как реализовать.

Буду благодарен за советы.

Комментариев: 2

  1. Аватар Dmitrij:

    Спасибо. Решение должно быть простым, как если бы вы использовали реестр ОС.

    "mainwindow.cpp"

    "dialog.cpp"

    Все предельно просто, компактный и понятный код.
    Отдельные личности на форумах вообще предлагают сохранять переменные в файл,
    чтобы в диалоге их прочитать и позже вернуть туда результаты работы))))
    На SSD прокатит, но это тоже дебильные способы, включая мой.

  2. Аватар Alex:

    Создай класс шины. в нем простые функции сетеры-гетеры. и напиши синглтон. получай доступ через него. и будет тебе счастье. пример такой. в классе Шина есть функция сетер например сетЛогин(стд::стринг стр) в которой стр присваивается к приватной переменной стд::стринг м_логин. и есть функция которая возвращает эту прватную переменную например гетЛогин() {ретурн м_логин;}. в одном цпп файле передаешь строку в сет фунцию в другом цпп чтобы получить эту строку вызываешь гет функцию. вот и все! все просто и без сигналов слотов

Добавить комментарий

Ваш E-mail не будет опубликован. Обязательные поля помечены *