簡體   English   中英

如何使用 const 成員變量設置數組大小?

[英]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::vectorstd::array提供數組功能,這可能使我們的代碼更具可讀性、可移植性和健壯性。 我希望在您的情況下,堆棧上的std::arraystd::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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM