|
|
|
Forum Guru
      
участник
Last Login: 06.12.2007 15:50
Сообщ.: 63,
Visits: 589
|
|
Проблема: есть 2 модуля (модуля классов) ,связанные include (может быть перекрёстным include) . Есть функция модуля 2 вызываемая из модуля 1, меняющая переменную модуля 2 Есть 2 модульное (консольное ) приложение из 2 модулей unit1 и unit2 Unit1.cpp ------------------------------- #include "unit2.h" #include <stdio.h> #include <conio.h> int main(int argc, char* argv[]) { char ch; test(); printf("%4i", i); getch(); return 0; } Unit2.h ------------------------------- int i; void test(); #include "Unit2.h" void test() { i=1; } Проблема в том, что хотя переменная I « видна» в unit1 (т.е компилятор не придирается к отсутствию её определения в unit1) но после вызова функции test получается i=0 вместо ожидаемого i=1 1 из решений состоит в замене такого определения переменной в хэдер-файле И объяалении её в 1 из модулей, а в другом её же с директивой external. Но, согласитесь, работать с exterrnal в объектно-ориентированном программировании по кр мере архаично (что-то вроде common-блоков Фортрана). Неужели способ , описанный выше нельзя поправить, может за счёт условной компиляции может еще как. Иначе получается что единственный способ межмодульных связей – только через external ???
|
|
|
|
|
Supreme Being
модератор
Last Login: 04.05.2008 13:32
Сообщ.: 7 240,
Visits: 65 445
|
|
| Правильно будет указать extern int i; в unit2.h и int i; в unit2.cpp. Если тебя смущает использование external в объектно-ориентированном языке, то следует все писать с использованием классов. Иначе странно получается. Функции вне классов (не-ООП подход) тебя устраивает, а extern нет. Не вижу в этом логики. Одно из достоинств C++ состоит как раз в возможности использования и ООП и "старого" процедурного подхода.
|
|
|
|
|
Supreme Being
      
модератор
Last Login: 09.07.2008 2:17
Сообщ.: 1 298,
Visits: 12 500
|
|
bazile все сказал, если мыслить понятиями ООП, то надо пользоваться классами, тогда любого рода глобальные переменные должны быть представлены атрибутами класса, а класс по необходимости можно оформить в виде синглетона (Singleton pattern)
Удачи,
Владимир
|
|
|
|