2017-08-01 61 views
2

我在C++ 11中有兩個類A和B.有一個靜態數組A類,這是在B類 這裏使用的是簡化的問題:如何避免在類中明確指定靜態數組的大小

// A.h 
class A { 
public: 
    static int const a[4]; 
}; 

// A.cpp 
int const A::a[4] = {1,2,3,4}; 

// B.h 
class B { 
public: 
    void method(); 
}; 

// B.cpp 
void B::method() { 
    for(auto const& it:a) { 
     /* do something */ 
    } 
} 

它的工作原理,但它需要陣列尺寸的明確定義。我想在編譯時不時更改數組初始值設定項的內容,而無需手動重新定義其大小。

什麼是等效的,但更有效的方式來做到這一點?

+5

'std :: vector'怎麼樣? –

+1

@Someprogrammerdude這兩者之間有很大的區別。 – SergeyA

+1

你是什麼意思?在**編譯**時間或運行時更改數組的大小? – SergeyA

回答

10

如果是const你不能這樣做。如果是constexpr但是,您可以:

class A { 
public: 
    static constexpr int a[] = {1, 2, 3, 4}; 
}; 

只需推動初始化到類定義。然後您可以完全省略數組大小。


一個警告要注意,如@SergeBallesta指出的是,你不能定義爲存儲陣列如果ODR使用它跳過。你的例子顯然在循環的範圍內(它需要指向開始和結束的指針)。所以你的cpp文件仍然需要一個const int A::a[];聲明。

在C++ 17中,由於內聯變量被添加到語言中,您至少可以創建定義頭。

+0

它只有在'a'的類型是像'int'這樣的文字時才起作用。如果它的類型是'std :: string'呢? – BalazsToth

+0

@blzs - 適用於任何具有constexpr構造函數的類型。 'std :: string'不會,但這並不意味着你不能定義那些類型。 – StoryTeller

+0

現在好多了:-) –