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