2017-06-13 37 views
3

我想聲明陣列成員變量的長度,使用類別的恆定靜態變量。如果我做的:C++:如何用一個靜態常量變量指定數組長度?

// A.h 
#include <array> 
using namespace std; 
class A { 
     array<int,LENGTH> internalArray; 
public: 
     const static int LENGTH; 
}; 

// A.cpp 
#include "A.h" 
constexpr int A::LENGTH{10}; 

有一個在A.H錯誤:「‘長度’並沒有在此範圍聲明」,聲明internalArray時。

我覺得這很奇怪,因爲類成員變量LENGTH如何超出範圍內的範圍?我發現的唯一的解決方法是初始化從A.cpp移動到A.H:

// A.h 
#include <array> 
using namespace std; 
constexpr int LENGTH{10}; 
class A { 
     array<int,LENGTH> internalArray; 
public: 
     const static int LENGTH; 
}; 

但據我瞭解,首先這是兩個不同的變量:全局命名空間範圍的長度和類範圍的長度。另外,在.h中聲明一個變量(在A類之外)將在包含頭文件的每個翻譯單元中創建一個獨立的LENGTH對象。

有沒有辦法用靜態類作用域變量指定數組的長度?

+0

_how類型成員變量<...>超出了範圍內的類_因爲編譯器自上而下讀取文件。如果某個名字在它看到的時候沒有聲明 - 會引發錯誤。而且,很明顯,「LENGTH」低於它的第一個用法。 –

+2

您可能需要頭中定義的'LENGTH'的值(以及數組定義的上面);沒有它,'A'的實例的大小對於除'A.cpp'以外的任何人都是不可用的,這使得任何人都無法實例化你的類(他們怎麼知道要爲一個實例保留多少內存呢?) 。你有沒有嘗試按照[這裏的指導]定義它(https://stackoverflow.com/questions/16832836/defining-static-const-variable-in-c)?這是C風格的數組,但它是一樣的想法;您需要爲'LENGTH'定義一個值,將其用作編譯時常量。 – ShadowRanger

+0

@Algirdas Preidzius你是對的我必須首先把LENGTH的聲明。 –

回答

4

試試這個:

#include <array> 

class A { 
public: 
    static const size_t LENGTH = 12; 
private: 
    std::array<int,LENGTH> internalArray; 
}; 

int main(){ 
    A a; 
} 

您可以直接在您的類頭申報LENGTH價值,沒有必要有它是一個單獨的全局變量或爲它生活在cpp文件。

使用size_t類型,因爲這是std::array模板所期望的。

如果公共/私人安排對您不利,請確保您可以在班級標題中包含多個公共/私人指標。

+0

非常感謝理查德,這是個訣竅。我可以修改公共/私人安排,沒有問題,順便說一句。再次感謝。 –