繁体   English   中英

.h和.cpp文件中的向量定义

[英]Vector definition in .h and .cpp file

因此,我正在阅读有关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文件中对vector的类似定义给了我错误vecSize is not a typename而如果我尝试在main()做类似的事情,它是完全有效的。

为什么会这样呢? 有什么帮助吗? 我想我缺少了一些东西,有些我不知道。 谢谢。

您可以如下更改代码:

    // 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的定义,并且对于复杂类进行声明内联初始化是不可能的。

这是因为,在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.

但是,总的来说,您要定义一个对象,该对象是矢量的实例化(分配了内存的事物),因此可以在那里进行初始化。

[提交此内容后,我在上面看到了您的评论]

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

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

您应该要切换到C ++ 11

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM