Определяете в одном из .h файлов переменную типа static, если статических переменных много, можно определить в классе (someClass::staticVariable), затем подключаете этот заголовочный файл в других, и используете.
someClass.h:
class someClass
{
static int var1;
static double var2;
}
Блин, ну не могут быть по-человечески реализованы такие простые вещи...
Чтобы создать переменную, необходимо создать файл с описанием класса, описать там создаваемую переменную и обращаться к этой переменной через имя класса...
Как-то уже скучаю по си для доса...
Гораздо всё было продуманнее и стройнее...
А за помощь, огромное спасибо, до такого бреда от разработчиков, сам бы не додумался!
Буду заниматься втыканием бредового кода наиудобнейшем программированием под линукс.
Тем что на С++ тебе надо писать собственный класс чего-то-там и у бивать время на его реализацию и тестинг. Под Qt уже реализовано довольно много разного рода контролов и класов для работы начиная от текста до штмл и т.д. что резко во много раз сокращает разработку софта. Темболее написаная СНАЧАЛО на линуксе прога на Qt, очень успешно компилится на платформе Виндовс, а не наоборот. Сколько нитья на многих форумах от некоторых программистов о том что написал софт под винду, а потом компилил на линуксе и оно неработает, а потомучто(и очень многие это пишут), еще раз повторюсь надо сначала создать софтину на Линуксе, а потом портировать на другие системы, и на крайняк уже дотачивать если нужно. Ведь нет ничего идеально работающего ;)
И если опять возникает тот же вопрос "чем отличается", ничем, это и есть С++ в очень расширенном варианте ;), как бы образно выражаясь.
Темболее написаная СНАЧАЛО на линуксе прога на Qt, очень успешно компилится на платформе Виндовс, а не наоборот.
Одновременно работал с проектом под Linux и под XP, тупо таская его на флэшке. При чем начинал на XP. Проблем с компиляцией никаких. Надо только очистить его от уже скомпилированных объектных файлов. ЧЯНТД?
Чтобы создать переменную, необходимо создать файл с описанием класса, описать там создаваемую переменную и обращаться к этой переменной через имя класса...
И это правильно. Глобальные переменные в языке, ориентированном на ООП - зло!
Нет.
1. Нужно в свойствах проекта указать, в какой кодировке будут исходники. По умолчанию стоит системная, а в win и linux она разная...
2. Если нужно вывести текст, указанный прямо в коде, то указываем fromВыбраннаяКодировка. Желательно еще добавлять tr() - проблем с переводом меньше будет.
Это зло, если не контролируешь переменные.
А мне надо всего ОДНУ глобальную переменную, не сотню, не две, ради чего имело бы смысл делать отдельные классы.
Задумайтесь например о том когда у вас офигенно здоровый корпоративный проект, и когда в этом проетке есть куча глобальных переменных, которые так и гадят в памяти, а не уничтожаются по завершению какого нибудь класса или функции как того требуется, а потом еще и гдето прога глюканет и вылетит, оставля позади себя кучи мусора в памяти и т.д. ;) вот тогда вы поймете что такое глобальные переменные. А насчет кода - код небывает бредовым, это творчество удобства, хоть и не всегда простоты.
Если ты хочешь, чтобы твоя глобальная переменная была в единственном (!!!) экземпляре на все единицы трансляции и была видна из любого модуля:
1) Выбери какую - нибудь одну единицу трансляции, а лучше создай свою. Иными словами создай два файла с именами(допустим): global.h и global.cpp
2) Объяви в хедере ее с ключевым словом extern, а в cpp определи
3) Заинклюдь свой хедер в те единицы трансляции (cpp) где ты хочешь, чтобы твоя переменная была видна
Пример:
global.h #ifndef __GLOBAL_H_ #define __GLOBAL_H_
Теме месяцев 10 уже как, а она всё ещё будоражит умы форумчан.
Когда я спрашивал, как глобально объявить переменную, можно было бы просто ответить, что её надо всего-навсего описать в заголовочном файле в разделе globals.
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include
#include
#include "ui_mainwindow.h"
class MainWindow : public QMainWindow, public Ui::MainWindow
{
Q_OBJECT
bool findevents и int eventscount видны из любой подпрограммы, так что их можно считать глобальными переменными.
В любом случае, проблема хранения данных между подпрограммами решилась таким способом.
ок ) я не буду продолжать спор, действительно тема уже давно закрыта. просто если под подпрограммами ты подразумеваешь методы-члены класса MainWindow, то я соглашусь с тем, что внутри класса эти переменные можно назвать, хоть и с натяжкой, глобальными относительно экземпляра (!!!) класса
я не хотел поднимать старую тему, просто по невнимательности зашел и отписал как надо объвлять глобальные, для всех единиц трансляции, переменные в global scope
Сделал по образцу "null56 - 12 Апрель, 2010 - 14:17" - не получается. У меня Qt Creator.
Программа по кнопке открывает новую форму (диалог) где пользователь вносит значение. Диалог закрывается и значение (текст) должно вернуться в центральную программу (откуда диалог запускался mainwindow.cpp).
С удовольствием сделаю без глобальных, хотя бы на сигнал\слотах, но след.конструкция также не работает.
...
{
ui->setupUi(this);
connect (dialog_namestring, SIGNAL(StateChanged(QString)), this, SLOT (dialog_namestring_catcher));
}
/*
где:
QString dialog_namestring;// локальная, объявлена в "диалоге"
void MainWindow::dialog_namestring_catcher() {// функция "перехвата" в центральной программе (главное окно вызова диалога)
*/
Определяете в одном из .h файлов переменную типа static, если статических переменных много, можно определить в классе (someClass::staticVariable), затем подключаете этот заголовочный файл в других, и используете.
someClass.h:
class someClass
{
static int var1;
static double var2;
}
---
otherClass.cpp:
#include "someClass.h"
someClass::var1 = 5;
someClass::var2 = someClass::var1 / 2.0;
А вообще, глобальные переменные - плохая практика. Лучше передавайте переменные в качестве аргумента.
Блин, ну не могут быть по-человечески реализованы такие простые вещи...
Чтобы создать переменную, необходимо создать файл с описанием класса, описать там создаваемую переменную и обращаться к этой переменной через имя класса...
Как-то уже скучаю по си для доса...
Гораздо всё было продуманнее и стройнее...
А за помощь, огромное спасибо, до такого бреда от разработчиков, сам бы не додумался!
Буду заниматься
втыканием бредового коданаиудобнейшем программированием под линукс.Не понял, чем отличается программирование на Qt от программирования на Cи? Си является подмножеством Си++, Си++ он и в Qt под линукс Си++.
Тем что на С++ тебе надо писать собственный класс чего-то-там и у бивать время на его реализацию и тестинг. Под Qt уже реализовано довольно много разного рода контролов и класов для работы начиная от текста до штмл и т.д. что резко во много раз сокращает разработку софта. Темболее написаная СНАЧАЛО на линуксе прога на Qt, очень успешно компилится на платформе Виндовс, а не наоборот. Сколько нитья на многих форумах от некоторых программистов о том что написал софт под винду, а потом компилил на линуксе и оно неработает, а потомучто(и очень многие это пишут), еще раз повторюсь надо сначала создать софтину на Линуксе, а потом портировать на другие системы, и на крайняк уже дотачивать если нужно. Ведь нет ничего идеально работающего ;)
И если опять возникает тот же вопрос "чем отличается", ничем, это и есть С++ в очень расширенном варианте ;), как бы образно выражаясь.
Одновременно работал с проектом под Linux и под XP, тупо таская его на флэшке. При чем начинал на XP. Проблем с компиляцией никаких. Надо только очистить его от уже скомпилированных объектных файлов. ЧЯНТД?
И это правильно. Глобальные переменные в языке, ориентированном на ООП - зло!
С кодировкой под виндой тоже никаких проблем небыло? Особенно с кирилицей? ;)
Потому как у меня были и очень частые, приходится возле каждой строки вставлять fromUtf8, особенно когда еще и украинизируешь софтину, или наоборот.
Нет.
1. Нужно в свойствах проекта указать, в какой кодировке будут исходники. По умолчанию стоит системная, а в win и linux она разная...
2. Если нужно вывести текст, указанный прямо в коде, то указываем fromВыбраннаяКодировка. Желательно еще добавлять tr() - проблем с переводом меньше будет.
И всё :)
Это зло, если не контролируешь переменные.
А мне надо всего ОДНУ глобальную переменную, не сотню, не две, ради чего имело бы смысл делать отдельные классы.
В одном месте одну, в другом одну... Потом покажется, что это вполне удобно, ну и... Соблазн велик, зачем лишний раз испытывать? ;D
имхо, надо сразу учиться писать "правильно".
Задумайтесь например о том когда у вас офигенно здоровый корпоративный проект, и когда в этом проетке есть куча глобальных переменных, которые так и гадят в памяти, а не уничтожаются по завершению какого нибудь класса или функции как того требуется, а потом еще и гдето прога глюканет и вылетит, оставля позади себя кучи мусора в памяти и т.д. ;) вот тогда вы поймете что такое глобальные переменные. А насчет кода - код небывает бредовым, это творчество удобства, хоть и не всегда простоты.
Ппц... Ужас, о чем можно говорить в этой теме? Статистическая переменная решение.
>> Статистическая переменная решение.
Статическая :)
нет глобальные переменные эт конечно зло но описать хотяб const char ProgrammName[] и Version[] эт разве излишество?
в один отдельный инклуд.
Если ты хочешь, чтобы твоя глобальная переменная была в единственном (!!!) экземпляре на все единицы трансляции и была видна из любого модуля:
1) Выбери какую - нибудь одну единицу трансляции, а лучше создай свою. Иными словами создай два файла с именами(допустим): global.h и global.cpp
2) Объяви в хедере ее с ключевым словом extern, а в cpp определи
3) Заинклюдь свой хедер в те единицы трансляции (cpp) где ты хочешь, чтобы твоя переменная была видна
Пример:
global.h
#ifndef __GLOBAL_H_
#define __GLOBAL_H_
extern int g_MyGlobalInt;
#endif
global.cpp
#include "global.h"
int g_MyGlobalInt = 0;
Теме месяцев 10 уже как, а она всё ещё будоражит умы форумчан.
Когда я спрашивал, как глобально объявить переменную, можно было бы просто ответить, что её надо всего-навсего описать в заголовочном файле в разделе globals.
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include
#include
#include "ui_mainwindow.h"
class MainWindow : public QMainWindow, public Ui::MainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = 0);
bool findevents;
int eventscount;
protected:
void closeEvent(QCloseEvent *event);
private slots:
void SortDataFile();
void EventsSelectione();
void iconActivated(QSystemTrayIcon::ActivationReason reason);
private:
QAction *quitAction;
QAction *launchAction;
QAction *sortAction;
QSystemTrayIcon *trayIcon;
QMenu *trayIconMenu;
};
#endif // MAINWINDOW_H
я не вижу у тебя глобальных переменных, я вижу обычные переменные-члены класса
bool findevents и int eventscount видны из любой подпрограммы, так что их можно считать глобальными переменными.
В любом случае, проблема хранения данных между подпрограммами решилась таким способом.
синглтон в помощь
ок ) я не буду продолжать спор, действительно тема уже давно закрыта. просто если под подпрограммами ты подразумеваешь методы-члены класса MainWindow, то я соглашусь с тем, что внутри класса эти переменные можно назвать, хоть и с натяжкой, глобальными относительно экземпляра (!!!) класса
я не хотел поднимать старую тему, просто по невнимательности зашел и отписал как надо объвлять глобальные, для всех единиц трансляции, переменные в global scope
удачи
или статические члены класса.
Сделал по образцу "null56 - 12 Апрель, 2010 - 14:17" - не получается. У меня Qt Creator.
Программа по кнопке открывает новую форму (диалог) где пользователь вносит значение. Диалог закрывается и значение (текст) должно вернуться в центральную программу (откуда диалог запускался mainwindow.cpp).
С удовольствием сделаю без глобальных, хотя бы на сигнал\слотах, но след.конструкция также не работает.
...
{
ui->setupUi(this);
connect (dialog_namestring, SIGNAL(StateChanged(QString)), this, SLOT (dialog_namestring_catcher));
}
/*
где:
QString dialog_namestring;// локальная, объявлена в "диалоге"
void MainWindow::dialog_namestring_catcher() {// функция "перехвата" в центральной программе (главное окно вызова диалога)
*/
Отправить комментарий