[英]How to set array size with const member variable?
我嘗試使用如下所示的 const 成員變量設置數組大小
class A {
const int SIZE;
A() : SIZE(10) {}
void aaa() { int a[SIZE]; }
};
我不能建造
[尺寸]
喜歡這個表情。
當我使用 GCC 時,構建成功。 但是當我使用 VC++ (Windows) 時,我無法構建。
錯誤信息是“'this'不能用於常量表達式”
如何使用 const 成員變量設置數組大小?
可變長度數組
當我使用 VC++ (Windows) 時,我無法構建。
在堆棧上創建一個數組int a[SIZE]
並具有自動存儲持續時間。 然后這個SIZE
通常必須在 C++ 編譯時確定。 但是您的SIZE
定義為沒有值,如下所示:
const int SIZE;
因此編譯器在編譯時無法知道它的值,並且會顯示編譯錯誤。 所以你的SIZE
是一個動態變量。
當我使用 GCC 時,構建成功。
...但一些 C++ 編譯器支持 VLA(可變長度數組),它是 C99 的補充,並允許在堆棧上聲明具有動態長度的 C 樣式數組。 VC++ 不支持 C99 和 VLA,但GNU 編譯器即使在 C90 和 C++ 中也支持 VLA 作為擴展。 這就是為什么您可以通過 GCC 編譯上述代碼而不會出錯的原因。
如果在 gcc 編譯命令中添加-pedantic
( -pedantic-errors
) 選項,我們可以獲得大多數 gcc 擴展的警告(錯誤)。 在這種情況下,使用此選項我們應該得到警告(錯誤)消息: ISO C++ forbids variable length array 'a'
。
如何修復當前錯誤?
(1) 如果要使用 C 風格的數組,一種方法是將SIZE
設為宏,如下所示。 然后編譯器可以在編譯時知道它的值:
#define SIZE 10
class A
{
public:
A() {}
void aaa() { int a[SIZE]; }
};
(2) 在類定義中將SIZE
的值定義為static const
變量,然后編譯器再次可以在編譯時知道它的值:
class A
{
static constexpr int SIZE = 10;
public:
A() {}
void aaa() { int a[SIZE]; }
};
(3) C++ 通過std::vector
和std::array
提供數組功能,這可能使我們的代碼更具可讀性、可移植性和健壯性。 我希望在您的情況下,堆棧上的std::array
比std::vector
更有效,因為 10 int
需要更少的內存,而std::array
僅在堆棧上分配一次而不會引起問題。 這是std::array
的解決方案:
#include <array>
class A
{
static constexpr int SIZE = 10;
public:
A() {}
void aaa() { std::array<int, SIZE> a; }
};
嗯, SIZE
可能不是一個宏,因為在這里,你用 10 初始化它並將它作為一個變量。 如果它是一個宏,則您的表達式int a[SIZE]
會起作用,但無論如何您都不需要第 2-4 行。
如果SIZE
像這里一樣是一個普通變量(包括使用 size 參數動態創建A
,盡管輸入可能來自宏),您應該使用向量。
#include <vector>
class A {
const int SIZE;
A() : SIZE(10) {}
void aaa() { std::vector<int> a(SIZE); }
};
的使用a
現在是一樣的。
如果您使用的是 c++11 之前的舊編譯器,例如 c++03,您也可以執行enum {SIZE=10};
class A {
enum {SIZE=10};
void aaa() {int a[SIZE];}
};
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.