- Любые глобальные вещи должны быть объявлены, но не определено в вашем файле заголовка.
- Включить файл заголовка в ваши файлы. cpp.
- Не включайте. cpp файлы в другие. cpp файлы.
- Объявите каждую вещь в заголовочном файле в один вашего. cpp файлы.
Объявление гласит: "эта вещь где-то существует", а определение гласит "заставить эту вещь существовать". C ++ имеет правило одного определения, которое гласит, что во всей программе может существовать только одно определение для конкретной вещи. 1
Если вы поместите определение в заголовочный файл и включите его в два. cpp файла, тогда определение существует дважды в программе (по одному в каждом. cpp файле), и это является причиной вашей ошибки.
Вот несколько примеров объявлений:
void foo(); // function declaration
extern float bar; // variable declaration
Вот несколько примеров определений:
void foo() { } // function definition
float bar; // global variable definition
static float widget; // local variable definition
Итак, в вашем .h файле вы должны объявить свои переменные, но не определите их:
extern float netWorth;
extern float salary;
extern float percentOfOres;
Затем в одном ваших. cpp файлах вы определите их:
float netWorth{ 0.0 };
float salary{ 0.0 };
float percentOfOres{ 0.0 };
Любые переменные верхнего уровня (объявленные вне функции), которые используются только в одном файле. cpp, могут быть объявлены static
. Эти переменные считаются скрытыми деталями реализации этого одного модуля компиляции и не будут видны снаружи.
То есть, вы можете иметь static float foo;
в двух разных файлах. cpp, не нарушая одно- определение правила. Однако имейте в виду, что foo
каждого файла относится к отдельной переменной!
1 Есть некоторые исключения из этого правила. В частности, функции, объявленные inline
, могут присутствовать в нескольких блоках компиляции, и компоновщик выберет один из них и отбросит остальные.