簡體   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