2015-02-01 4 views
0

Так я шел через текст на C++ и заметил следующий код:Вектор определение в .h и .cpp файл

// example.h 
    class Example { 
    public: 
    static const double rate = 6.5; 
    static const int vecSize = 20; 
    static vector<double> vec(vecSize); // Error! 
    }; 

//myfile.cpp 
    int main() 
{ 
    int vecsize=20; 
    vector<double> v(vecsize); // OK! 

    return 0; 
} 

Как вы можете видеть комментарии, подобного рода определения для вектора. h файл дает мне ошибку vecSize is not a typename, тогда как это совершенно верно, если я попытаюсь сделать что-то подобное в main().

Почему так происходит? Любая помощь? Наверное, я что-то упускаю, есть что-то, чего я не знаю. Спасибо.

ответ

2

Вы можете изменить свой код следующим образом:

// example.h 
    class Example { 
    public: 
    static const double rate = 6.5; 
    static const int vecSize = 20; 
    static vector<double> vec; // <<<<< 
    }; 

    vector<double> Exanple::vec(vecSize); 

Ты недостающее определение для Example::vec, и это не возможно, что путь с инициализацией декларации инлайн для сложных классов.

+0

Хорошо, так что позвольте мне попробовать: поскольку нам не разрешено инициализировать статические неконстантные элементы в классе, запись 'static vector vec (vecSize)' недействительна, поскольку на самом деле пытается выделить память, которая, очевидно, должна быть не позволил. Правильно? –

+0

@AkshayArora Да, для инициализации 'Example :: vec' имеется выделение памяти. –

+0

Спасибо, это то, что я искал. –

0

Вы, вероятно, забыли #include <vector>, и вы должны написать std::vector<double> вместо vector<double>.

Вы должны хотеть, чтобы переключиться на C++11

1

Это потому, что в файле 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-файл, у каждого из них есть своя собственная копия памяти, что лишает компоновщика путаницы.

Смежные вопросы