在.h和.cpp文件中的矢量定义

时间:2015-02-01 07:09:35

标签: c++

所以我正在阅读关于C ++的文本并注意到以下代码:

    // 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()中执行此类操作,则完全有效。

为什么会这样?有帮助吗?我想我错过了什么,有些东西我不知道。 感谢。

3 个答案:

答案 0 :(得分: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的定义,并且对于复杂类的声明内联初始化,这种方式不可能。

答案 1 :(得分:1)

那是因为,在h文件中,你正在对你的类中的事物进行声明,并且除非定义了变量,否则不允许对你的变量进行初始化,因为它不是const(甚至是大多数静态const事物)也不能在那里初始化。由于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.

然而,在main中,你定义的是一个对象,它是一个向量的实例化(一个分配了内存的东西),所以你可以在那里初始化它。

[提交之后,我看到了你上面的评论]

一个类可以包含另一个类,因为类就像对象的蓝图。如果类A包含类B,则类A的所有实例都包含类B的实例。内存在实例化时被分配。类本身有内存:函数定义和静态变量。但是它们需要在.c文件中的类定义之外进行设置,因为否则,当其他2个库包含包含.h文件的代码时,它们每个都有自己的内存副本,这会使链接器感到困惑。

答案 2 :(得分:0)

您可能忘了#include <vector>而应该写std::vector<double>而不是vector<double>

您应该切换到C++11