[英]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.