所以我正在阅读关于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()
中执行此类操作,则完全有效。
为什么会这样?有帮助吗?我想我错过了什么,有些东西我不知道。 感谢。
答案 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