crossplatform.ru

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

 
Ответить в данную темуНачать новую тему
> Глобальные переменные
Raks123
  опции профиля:
сообщение 22.11.2011, 16:05
Сообщение #1


Студент
*

Группа: Новичок
Сообщений: 16
Регистрация: 2.10.2011
Пользователь №: 2920

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




Репутация:   0  


Вопрос такой: как правильно создать глобальную переменную, чтобы её было видно в разных cpp файлах? Знаю, что это плохая практика, но все-таки у меня по другому, даже через самую большую задницу, которую я пытался изобрести не получается(((
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
PAFOS
  опции профиля:
сообщение 22.11.2011, 16:26
Сообщение #2


Активный участник
***

Группа: Участник
Сообщений: 258
Регистрация: 27.12.2010
Из: Дмитров
Пользователь №: 2309

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




Репутация:   8  


на такие случаи я обычно делаю один класс, в который пихаю статические переменные. - Удобно и красиво)

[GlobalVariables.h]
class GlobalVariables
{

public:
  static int Var1;
  static int Var2;

}


[GlobalVariables.cpp]
int GlobalViriables::Var1 = 0;
int GlobalViriables::Var2 = 0;

Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ilyabvt
  опции профиля:
сообщение 22.11.2011, 17:38
Сообщение #3


Активный участник
***

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

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




Репутация:   3  


Используйте ключевое слово extern, прочитать можно например здесь:
http://www.rsdn.ru/forum/cpp/2706624.1.aspx
Но если таких переменных куча, то лучше использовать способ от PAFOS.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 23.11.2011, 7:36
Сообщение #4


фрилансер
******

Группа: Участник
Сообщений: 2941
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

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




Репутация:   34  


с классом всегда удобнее :)

extern - это хвостик от C остался

Сообщение отредактировал Алексей1153 - 23.11.2011, 7:36
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Raks123
  опции профиля:
сообщение 25.11.2011, 19:56
Сообщение #5


Студент
*

Группа: Новичок
Сообщений: 16
Регистрация: 2.10.2011
Пользователь №: 2920

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




Репутация:   0  


Навыдавало кучу ошибок, подскажите что не так:
Вот у меня есть global.h

#include <QMetaType>
#include <QVector>

struct MyStruct{
    QString adress;
    int port;
    bool zanyatost;
    int vremya;
    QString nameScript;
};

class Global
{

public:
static QVector<MyStruct> vector;
static int kolichestvo;

};


Тут собралось нормально, но когда я заполняю перемнную kolichestvo и вектор vector в файле openbase.cpp вот так:

#include "openbase.h"
#include <qtsql>
#include "global.h"

....

void OpenBase::[i]run[/i]()
{
....
        QSqlQuery query;
        if (!query.exec("SELECT Adress, Port, Vremya, Script "
                                   "FROM baseservise "
                                  "WHERE Active = 'Yes';")) {
        qDebug() << "Unable to execute query - exiting";
        }
        QSqlRecord rec = query.record();
        Global::kolichestvo=0;

        while (query.next()) {
            Global::vector.resize(Global::kolichestvo + 1);
            Global::vector[Global::kolichestvo].adress  = query.value(rec.indexOf("Adress")).toString();
            Global::vector[Global::kolichestvo].port  = query.value(rec.indexOf("Port")).toInt();
            Global::vector[Global::kolichestvo].vremya = query.value(rec.indexOf("Vremya")).toInt();
            Global::vector[Global::kolichestvo].nameScript = query.value(rec.indexOf("Script")).toString();
            Global::vector[Global::kolichestvo].zanyatost=true;
            Global::kolichestvo += 1;
    }
    qDebug() << Global::kolichestvo;
    }
}


то выводит следующее -

release/openbase.o:openbase.cpp:(.text+0x60): undefined reference to `Global::vector'
release/openbase.o:openbase.cpp:(.text+0xc3): undefined reference to `Global::vector'
release/openbase.o:openbase.cpp:(.text+0xdc): undefined reference to `Global::vector'
release/openbase.o:openbase.cpp:(.text+0x192): undefined reference to `Global::vector'
release/openbase.o:openbase.cpp:(.text+0x1a6): undefined reference to `Global::vector'
release/openbase.o:openbase.cpp:(.text+0x1cd): more undefined references to `Global::vector' follow
release/openbase.o:openbase.cpp:(.text+0x67b): undefined reference to `Global::kolichestvo'
release/openbase.o:openbase.cpp:(.text+0x6b2): undefined reference to `Global::kolichestvo'
release/openbase.o:openbase.cpp:(.text+0x6b7): undefined reference to `Global::vector'
release/openbase.o:openbase.cpp:(.text+0x6cc): undefined reference to `Global::vector'
release/openbase.o:openbase.cpp:(.text+0x75d): undefined reference to `Global::kolichestvo'
release/openbase.o:openbase.cpp:(.text+0x762): undefined reference to `Global::vector'
release/openbase.o:openbase.cpp:(.text+0x777): undefined reference to `Global::vector'
release/openbase.o:openbase.cpp:(.text+0x858): undefined reference to `Global::kolichestvo'
release/openbase.o:openbase.cpp:(.text+0x85d): undefined reference to `Global::vector'
release/openbase.o:openbase.cpp:(.text+0x881): undefined reference to `Global::vector'
release/openbase.o:openbase.cpp:(.text+0x8bb): undefined reference to `Global::kolichestvo'
release/openbase.o:openbase.cpp:(.text+0x8c0): undefined reference to `Global::vector'
release/openbase.o:openbase.cpp:(.text+0x8dc): undefined reference to `Global::vector'
release/openbase.o:openbase.cpp:(.text+0x8e6): undefined reference to `Global::kolichestvo'
release/openbase.o:openbase.cpp:(.text+0x900): undefined reference to `Global::kolichestvo'
release/openbase.o:openbase.cpp:(.text+0x906): undefined reference to `Global::vector'
release/openbase.o:openbase.cpp:(.text+0x9b4): undefined reference to `Global::kolichestvo'
release/openbase.o:openbase.cpp:(.text+0x9b9): undefined reference to `Global::vector'
release/openbase.o:openbase.cpp:(.text+0x9dd): undefined reference to `Global::vector'
release/openbase.o:openbase.cpp:(.text+0xa7a): undefined reference to `Global::kolichestvo'
collect2: ld returned 1 exit status
mingw32-make[1]: *** [release\probnick.exe] Error 1
mingw32-make: *** [release] Error 2
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
sidsukana
  опции профиля:
сообщение 25.11.2011, 20:10
Сообщение #6


Участник
**

Группа: Участник
Сообщений: 158
Регистрация: 23.12.2010
Из: Челябинск
Пользователь №: 2296

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




Репутация:   2  


Первое определение вне объекта сделай. Чтото типа дефолтных значений.
Хотя если добавишь перед переменными тип, то может и так прокатит.)

PS имена переменных умиляют :) На первых страницах любого пособия по программированию первым делом предупреждают об использовании таких имен :)

Сообщение отредактировал sidsukana - 25.11.2011, 20:12
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
BlueIceScream
  опции профиля:
сообщение 25.11.2011, 21:27
Сообщение #7


Студент
*

Группа: Участник
Сообщений: 56
Регистрация: 21.11.2011
Из: Республика Дагестан
Пользователь №: 3016

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




Репутация:   3  



Статические члены класса создаются не при их объявлении, а при обязательном определении. Прежде чем писать код, надо уметь его писать. Срочно перечитывать книгу Срауструпа.

int Global::kolichestvo = <default value> - создаст статический член класса. Остальное подскажет книга.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Iron Bug
  опции профиля:
сообщение 25.11.2011, 21:55
Сообщение #8


Профессионал
*****

Группа: Модератор
Сообщений: 1611
Регистрация: 6.2.2009
Из: Yekaterinburg
Пользователь №: 533

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




Репутация:   12  


Цитата(Алексей1153 @ 23.11.2011, 10:36) *
с классом всегда удобнее :)

extern - это хвостик от C остался

не всегда. особенно при кроссплатформе и разных компиляторах. не все компиляторы понимают объявления без extern. это зависит от платформы и конкретного компилятора. extern поддерживают абсолютно все. это стандарт.
а вот экспорт классов в библиотеках разных компиляторов сделан по-разному. и часто для совместимости библиотек приходится писать обёртки и вызов отдельных функций именно через функции и extern, потому что это стандартный метод. а экспорт классов не стандартизован и каждый создатель компилятора делает, как может. а у мелкософта ещё и от версии к версии эти форматы менялись и в результате классы в библиотеках, собранных старыми студиями не совместимы с вызовами в новых :)
конечно, если это одна платформа, один компилятор и один программист - то решительно пофиг. но если вдруг собираешься экспортировать свои библиотеки (особенно закрытый код), то лучше избегать экспорта классов и глобальных данных. потому что с ними можно огрести геморроя при некоторых обстоятельствах.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

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


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




RSS Текстовая версия Сейчас: 25.11.2024, 19:46