Russian Qt Forum
Ноябрь 24, 2024, 01:46 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Проблема с статической переменной  (Прочитано 9372 раз)
blood_shadow
Гость
« : Сентябрь 22, 2010, 22:59 »

Есть хэдер(mainwindow.h), в котором объявлена статическая переменная recentFiles

Код:

#include <QMainWindow>


class QAction;
class QLabel;
class FindDialog;
class Spreadsheet;

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow();
    static QStringList recentFiles;

protected:
    void closeEvent(QCloseEvent *event);

};

QStringList MainWindow::recentFiles;


этот хэдер подключается в файл mainwindow.cpp и main.cpp, но проэкт не компилируется сборщик выдает следуещее:
Код:
./release\mainwindow.o:mainwindow.cpp:(.bss+0x0): multiple definition of `MainWindow::recentFiles' 
./release\main.o:main.cpp:(.bss+0x0): first defined here
./release\moc_mainwindow.o:moc_mainwindow.cpp:(.bss+0x0): multiple definition of `MainWindow::recentFiles'
./release\main.o:main.cpp:(.bss+0x0): first defined here
collect2: ld returned 1 exit status
mingw32-make[1]: *** [release\spreadsheet.exe] Error 1
mingw32-make: *** [release] Error 2
Процесс "C:/Program_Files/Qt/2010.02/mingw/bin/mingw32-make.exe" завершился с кодом %2.
Ошибка сборки проекта spreadsheet (цель: Настольный компьютер)
Во время выполнения сборки на этапе "Сборка"

Из этого я понял что при подключении хэдера в два файла, делается попытка создать два екземпляра переменной recentFiles, что делать нельзя, как поступить в этой ситуации если я хочу использовать эту статическую переменную?
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #1 : Сентябрь 23, 2010, 06:23 »

1) статическую переменную нужно инициализировать значением.
2) определение и инициализация должны находится в cpp-файле, а в заголовочном только объявление
Записан

Юра.
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #2 : Сентябрь 23, 2010, 08:30 »

иногда спасает слово const у статик переменной (если она может быть константной, но, очевидно, это не ваш случай)
Записан
blood_shadow
Гость
« Ответ #3 : Сентябрь 23, 2010, 23:38 »

1) статическую переменную нужно инициализировать значением.
2) определение и инициализация должны находится в cpp-файле, а в заголовочном только объявление
Спасибо помогло, наконец-то понял зачем второй раз объявлять статическую переменную Улыбающийся
еще вопрос - разве обязательно ее сразу же инициализировать, вот в книге Шилдта написано что все статические переменные инициализируются нулем еще до создания объекта?
Записан
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #4 : Сентябрь 24, 2010, 04:44 »

1) статическую переменную нужно инициализировать значением.
2) определение и инициализация должны находится в cpp-файле, а в заголовочном только объявление
Спасибо помогло, наконец-то понял зачем второй раз объявлять статическую переменную Улыбающийся
еще вопрос - разве обязательно ее сразу же инициализировать, вот в книге Шилдта написано что все статические переменные инициализируются нулем еще до создания объекта?

первый раз ты делаешь declaration, намёк на то, что в классе будет одна общая переменная для всех объектов. Эту переменную потом нужно явно создать (definition), и только один раз, иначе будут ошибки линковки.

По стандарту (3.6.2) статические члены инициализируются нулём перед любой другой инициализацией.
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #5 : Сентябрь 24, 2010, 07:27 »

ну QStringList нулём инициализировать не получится.
Я себе за правило такое взял: так как не у всех классов есть открытый конструктор по умолчанию, то лучше инициализировать самому. Чтоб знать с чего всё началось.
Записан

Юра.
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #6 : Сентябрь 24, 2010, 19:32 »

ну QStringList нулём инициализировать не получится.

там не совсем инициализация, там написано, что место под статический объект заполняется нулями.
Записан
blood_shadow
Гость
« Ответ #7 : Октябрь 25, 2010, 20:53 »

1) статическую переменную нужно инициализировать значением.
2) определение и инициализация должны находится в cpp-файле, а в заголовочном только объявление
a стало интересно, а можно допустим сделать статической переменную QString? как для нее и когда выделять память?
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #8 : Октябрь 25, 2010, 21:16 »

a стало интересно, а можно допустим сделать статической переменную QString? как для нее и когда выделять память?
Ну лучше спросить кто и когда для нее выделяет память? Это делает "невидимый" который вызывается еще до ф-ции main для инициализации всех static объектов. В разных компиляторах он называется по-разному, типа CRT_Init. А вообще желание "докопаться" - большой плюс (хотя неизвестно во что оно вольется  Улыбающийся
Записан
blood_shadow
Гость
« Ответ #9 : Октябрь 25, 2010, 21:30 »

a стало интересно, а можно допустим сделать статической переменную QString? как для нее и когда выделять память?
Ну лучше спросить кто и когда для нее выделяет память? Это делает "невидимый" который вызывается еще до ф-ции main для инициализации всех static объектов. В разных компиляторах он называется по-разному, типа CRT_Init. А вообще желание "докопаться" - большой плюс (хотя неизвестно во что оно вольется  Улыбающийся
а можете тогда указать где почитать инфу про данный процесс или хотя бы где искать?
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #10 : Октябрь 26, 2010, 11:50 »

а можете тогда указать где почитать инфу про данный процесс или хотя бы где искать?
Просто соорудите какой-нибудь класс и поставьте точку останова в его конструкторе. Объявите static экземпляр этого класса - ну и смотрите в отладчике что и как.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.133 секунд. Запросов: 22.