Это потому, что в файле h вы делаете объявление вещей в своем классе, и ваша переменная не может быть инициализирована, если она не определена, поскольку она не является константой (и даже большинством статических констант там тоже не могут быть инициализированы). Поскольку h-файлы могут быть включены различными c-файлами, которые в конечном итоге связаны друг с другом, вы получаете дубликаты, если у вас есть свои определения («фактическая память») для ваших переменных. Вы можете иметь несколько деклараций, но только одно определение. Обычно, я бы это сделать для этой ситуации:
.h файл
class Example {
public:
static const double rate = 6.5; // static const number: should be OK
static const int vecSize = 20; // ditto. Could move these to C file, too, though.
static vector<double> vec; // declared, but not defined or initialized.
}
.c файл
vector<double> Example::vec(vecSize); // compiles into a library, only exists in 1 place.
В основном, однако, вы определяете объект, который конкретизацией вектор (вещь с выделенной памятью), поэтому вы можете ее инициализировать.
[После того, как представил это, я видел ваши комментарии выше]
класса может содержать другой класс, потому что классы, как чертежи для объектов. Если класс A содержит класс B, все экземпляры класса A содержат экземпляр класса B. Память распределяется при создании экземпляра. Существует память для самого класса: определения функций и статические переменные. Но они должны быть настроены вне определения класса в файле .c, потому что в противном случае, когда в 2 других библиотеках есть код, который включает ваш .h-файл, у каждого из них есть своя собственная копия памяти, что лишает компоновщика путаницы.
Хорошо, так что позвольте мне попробовать: поскольку нам не разрешено инициализировать статические неконстантные элементы в классе, запись 'static vector vec (vecSize)' недействительна, поскольку на самом деле пытается выделить память, которая, очевидно, должна быть не позволил. Правильно? –
@AkshayArora Да, для инициализации 'Example :: vec' имеется выделение памяти. –
Спасибо, это то, что я искал. –