Управление глобальными переменными - PullRequest
1 голос
/ 16 мая 2011

У меня есть функции в двух (связанных) файлах C ++, которые оба используют одну и ту же переменную. Для меня (для начинающего) я мог видеть два способа справиться с этим:

  1. Передача переменной из первой функции во вторую (они последовательны в программе) или

  2. Определить переменную как глобальное значение в отдельном заголовочном файле, который оба файла c ++ включают в начале

Хотя (1) может показаться наиболее очевидным ответом, я решил использовать 2. По любой причине.

В любом случае, переменная теперь объявляется в заголовке, но если я пытаюсь присвоить значение переменной во время объявления, я получаю ошибку "(значение), уже определенное в main.obj".

Заголовок включен в начало обоих файлов C ++. Переменная не объявлена ​​где-либо еще, но она используется.

Должен быть очевидный ответ на это, но я очень плохо знаком с C ++. Любой, кто может пролить свет на то, почему я не могу присвоить переменной значение, я был бы очень благодарен.

Ответы [ 4 ]

2 голосов
/ 16 мая 2011
2 голосов
/ 16 мая 2011

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

myList.h

class list { ....};  

file1.cpp

#include "myList.h"
list * x ;

file2.cpp

#include "myList.h"
extern list * x;  
1 голос
/ 16 мая 2011

Хотя вы можете решить вопрос о том, как использовать глобал, гораздо лучше, если вы вообще его избежите. Если у вас есть две функции, которые изменяют одну переменную, то самое простое, что вы можете сделать, - передать переменную в качестве аргумента функции:

void foo( type & var );
void bar( type & var );
int main() {
   type t( constructor_argument );   // [1]
   // [2] operate on t before calling the functions
   foo( t );
   // [3] operate some more if needed
   bar( t );
   // [4] t now has been updated by both foo and bar
}

Если переменную не нужно создавать до первой функции ([1] не требуется и [2] не присутствует), тогда вы можете использовать эту переменную в качестве возвращаемого значения функции:

type foo(); // create and return the variable
void bar( type& );
int main() {
   type t = foo();
   // [3] operate on t
   bar( t );
   // [4] use the final t
}

Если вам не нужно обновлять переменную после вызова первой функции, а вторая функция фактически не изменяет переменную (она только читает то, что сделала первая функция), и переменная не нужна в main после выполнение второй функции ([4] пусто), тогда вы можете изменить сигнатуру второй функции и вообще избежать переменной в main:

type foo();
void bar( type );
int main() {
   bar( foo() );
}

Любое и все решения различных проблем, показанных здесь, намного лучше, чем наличие глобальной переменной, которая используется различными функциями. Когда вы читаете код в main (или любой другой функции, имеющей логику), становится очевидным, как данные передаются из одной точки в другую. В случае глобальных переменных необходимость вызова foo перед вызовом bar не является явной в коде, зависимость от глобального скрыта, если вы не прочитали реализацию функций.

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

0 голосов
/ 16 мая 2011

Создайте класс с этими двумя функциями (вы могли бы добавить еще) и переменную-член в нем. Использование глобальных переменных обычно считается плохой практикой в C ++.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...