Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Статические переменные. 2 на 1


Автор: OpenMan 23.8.2010, 13:11
Есть мой проект в котором есть захаркоденный размер окна, который объявлен как константа в отдельном юните.
Пришло время сделать так, чтобы размер окна менялся 1 раз за работу программы.

попытался сделать его как static int.
Фигня вот в чем:
Код

/* unit 2  */
static int fa=5;
static int gg = 20;

/* unit 3 */
int returnMulty(){ // + к этому метод декларирован в h-файле
    return gg*fa;
}

Теперь если это вызывать из формы
Код

void __fastcall TForm1::Button1Click(TObject *Sender)
{
fa+=1;
gg+=1;
Label1->Caption="1..  "+IntToStr(fa+gg);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
Label1->Caption="2..  "+IntToStr(fa*gg);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button3Click(TObject *Sender)
{
Label1->Caption="3..  "+IntToStr(returnMulty());
}


то очевидно, что fa*gg - это одно, а returnMulty() - это другое.
Другими словами для формы одни статические переменные, а для returnMulty() другие переменные.

Хочу, чтобы было как в java, каждая статическая переменная имела единственный экземпляр.

Как быть и что я не так делаю?

Автор: Леопольд 23.8.2010, 13:28
В С++ слово static, (применительно к глобальным переменным и функциям) означает internal linkage. 
Цитата(OpenMan @  23.8.2010,  13:11 Найти цитируемый пост)
Как быть и что я не так делаю?
Может стоит выучить азы языка?

Автор: OpenMan 23.8.2010, 14:41
Всё это я когда-то знал или так думал. Но немного позабыл.
Учить все сначала - не вариант. Это локальная проблема.

Как я понял с Ваших слов, все так и должно быть, как оно и работает. Не удобно конечно, но ладно.

Как обойти эту шнягу? Должно же быть разумное средство и в С++. Как сделать изменяемую константу (псевдоконстанту)?
Чтобы её изменение в одном юните приводило к изменению во всех других юнитах?

Автор: Леопольд 23.8.2010, 15:28
OpenMan, надо заменить static на extern в заголовочном файле без инициализации (это будет объявление). В одном из cpp/c файлов надо определить эту переменную без слова static с инициализацией.

Автор: mes 23.8.2010, 17:02
Цитата(Леопольд @  23.8.2010,  14:28 Найти цитируемый пост)
в заголовочном файле без инициализации (это будет определение)


Цитата(Леопольд @  23.8.2010,  14:28 Найти цитируемый пост)
 В одном из cpp/c файлов надо определить 

 smile  smile 

Автор: OpenMan 23.8.2010, 17:05
Пасибо. Помогло.

Автор: Леопольд 23.8.2010, 17:20
mes, спасибо, поправил. Издержки печати вслепую... smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)