Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум на CrossPlatform.RU _ Qt Общие вопросы _ Глобальные Static переменные

Автор: defnull 8.5.2009, 18:52

Доброго времени суток.. натолкнулся на проблему которая просто взорвала мне мозг..
Вообщем есть глобальная переменная определённая в файле Enums.h :

namespace Transac
{
    static int cre = 3;
};

Есть одна функция класса CommandLoadEditRequest которая заканчивает свою работу так:
        Transac::cre = -1;

    emit doneSuccesfully();
    return true;
}

Тоесть попросту меняет значение этой глобальной переменной и высылает сигнал.
Сигнал сразу же ловится (cсоединён connect(commandLoad, SIGNAL(doneSuccesfully()), this, SLOT(slotCreateRequest())); )

void visualRequestEdit::slotCreateRequest()
{
       qDebug() << ":::::" << Transac::cre;


И выводит мне не -1 а 3!!

Сперва я подумал что просто что-то напутал и набросал простенький пример на чистом с++ дабы проверить как это всё работает по аналогии:
// main
#include "enums.h"
#include "hmm2.h"
#include "hmm.h"
int main(int argc, char *argv[])
{
    int t = 20;
    hm();
    t = DataBase::TA;
    return 0;
}

// enums.h
#ifndef ____nawjefawef
#define ____nawjefawef
namespace DataBase{ static int TA = 4; };
#endif

// hmm.h
#ifndef _awkjrefhl234
#define _awkjrefhl234
#include "enums.h"
#include "hmm2.h"

void hm()
{
    int i = DataBase::TA;
    DataBase::TA = 9;
    hm2();
    return;
}
#endif

// hmm2.h
#ifndef _awkjrefhl
#define _awkjrefhl
#include "enums.h"
void hm2()
{
    int h = DataBase::TA;
    DataBase::TA = -9;
    return;
}
#endif

Но он работает корректно в отличии от предыдущего =(((
Всё было бы смешно если бы не было так грустно, ибо убил уже дофига времени на всё это =((( з.ы. Весь проект конечно скинуть можно но имхо не имеет смысла.. объёмный ..

Автор: DmP 8.5.2009, 19:14

Цитата(defnull @ 8.5.2009, 19:52) *
namespace Transac
{
static int cre = 3;
};

Наверное надо добавить extern и инициализацию перенести в .cpp?

Автор: defnull 8.5.2009, 19:45

Мдя =( про exteren-то я и позабыл...
Меня вот только оч смущает почему же на чистом с++ пример работал. Хотя там попытался нечто похожее сделать... Пойду гляну что Страуструп на эту тему пишет..
Добавил в сpp файлы где использую Transac::cre

extern int Transac::cre;

Да только воз и ныне там.. что-то я не догоняю=(

Автор: Kagami 8.5.2009, 20:08

У меня все работает...

 test.zip ( 1.13 килобайт ) : 48
 

Автор: DmP 8.5.2009, 20:12

Цитата(defnull @ 8.5.2009, 20:45) *
Добавил в сpp файлы где использую Transac::cre

extern int Transac::cre;


extern пишется в заголовочном файле enum.h:
namespace Transac
{
extern int cre;
};


В одном файле из *.cpp, например, в enum.cpp:
namespace Transac
{
int cre = 3;
};

Должно работать.

Автор: defnull 8.5.2009, 20:18

Kagami,
Посмотрел ваш пример, у меня мой пример на чистом С++ тоже работает. Вероятно вся проблема в моём случае в компоновке так как высылающий сигнал класс и принимающий в разных cpp файлах... сейчас попробую пошаманить ещё..
DmP
Вы оказались правы=) Фуф ну наконец-то, а то замучался совсем... с другой стороны выявил места в которых мне ещё надо поразбираться..
Всем спасибо за помощь!)

Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)