crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> Глобальные Static переменные
defnull
  опции профиля:
сообщение 8.5.2009, 18:52
Сообщение #1


Студент
*

Группа: Участник
Сообщений: 49
Регистрация: 1.5.2008
Пользователь №: 165

Спасибо сказали: 0 раз(а)




Репутация:   1  


Доброго времени суток.. натолкнулся на проблему которая просто взорвала мне мозг..
Вообщем есть глобальная переменная определённая в файле 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

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

Сообщение отредактировал defnull - 8.5.2009, 18:53
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
DmP
  опции профиля:
сообщение 8.5.2009, 19:14
Сообщение #2


Студент
*

Группа: Участник
Сообщений: 61
Регистрация: 11.3.2008
Пользователь №: 116

Спасибо сказали: 15 раз(а)




Репутация:   2  


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

Наверное надо добавить extern и инициализацию перенести в .cpp?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
defnull
  опции профиля:
сообщение 8.5.2009, 19:45
Сообщение #3


Студент
*

Группа: Участник
Сообщений: 49
Регистрация: 1.5.2008
Пользователь №: 165

Спасибо сказали: 0 раз(а)




Репутация:   1  


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

extern int Transac::cre;

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

Сообщение отредактировал defnull - 8.5.2009, 19:59
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Kagami
  опции профиля:
сообщение 8.5.2009, 20:08
Сообщение #4


Старейший участник
****

Группа: Участник
Сообщений: 601
Регистрация: 2.2.2009
Пользователь №: 523

Спасибо сказали: 101 раз(а)




Репутация:   9  


У меня все работает...
Прикрепленные файлы
Прикрепленный файл  test.zip ( 1,13 килобайт ) Кол-во скачиваний: 129
 
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
DmP
  опции профиля:
сообщение 8.5.2009, 20:12
Сообщение #5


Студент
*

Группа: Участник
Сообщений: 61
Регистрация: 11.3.2008
Пользователь №: 116

Спасибо сказали: 15 раз(а)




Репутация:   2  


Цитата(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;
};

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

Сообщение отредактировал DmP - 8.5.2009, 20:14
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
defnull
  опции профиля:
сообщение 8.5.2009, 20:18
Сообщение #6


Студент
*

Группа: Участник
Сообщений: 49
Регистрация: 1.5.2008
Пользователь №: 165

Спасибо сказали: 0 раз(а)




Репутация:   1  


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

Сообщение отредактировал defnull - 8.5.2009, 20:24
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 26.11.2024, 21:52