【问题标题】:C++: How to specify array length with a static constant variable?C++:如何用静态常量变量指定数组长度?
【发布时间】:2017-11-15 18:35:52
【问题描述】:

我想用一个类的常量静态变量来声明一个数组成员变量的长度。如果我这样做:

// 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};

在声明 internalArray 时,A.h 中出现错误:“'LENGTH' 未在此范围内声明”。

我觉得很奇怪,因为一个类成员变量,即 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;
};

但据我了解,首先这是两个不同的变量:全局命名空间范围 LENGTH 和类范围 LENGTH。此外,在 .h(A 类之外)中声明一个变量将在每个包含标头的翻译单元中创建一个独立的 LENGTH 对象。

有没有办法用静态类范围变量指定数组的长度?

【问题讨论】:

  • 为什么类成员变量<...>超出了类内部的范围因为编译器是自上而下读取文件的。如果某个名称在它看到时未声明 - 会引发错误。而且,很明显,LENGTH 低于它的首次使用。
  • 您可能需要在标题中定义LENGTH 的值(以及在数组定义的上方);没有它,A 实例的大小除了A.cpp 之外的任何人都无法使用,这使得其他任何人都无法实例化您的类(否则他们怎么知道要为实例保留多少内存?)。您是否尝试过按照the guidelines here 定义它?这适用于 C 风格的数组,但想法相同;您需要为 LENGTH 定义一个值才能将其用作编译时常量。
  • @Algirdas Preidžius 你说得对,我必须先声明 LENGTH。
  • @Vlad 来自莫斯科,你说得对,我必须先声明 LENGTH。
  • @ShadowRanger 感谢您提供的信息,我必须完成一些代码,然后看看您的链接。

标签: c++ c++11 constexpr stdarray


【解决方案1】:

试试这个:

#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 模板所期望的。

如果公共/私有安排对您不利,请知道您可以在类头中包含多个公共/私有指示符。

【讨论】:

  • 非常感谢理查德,这可以解决问题。顺便说一句,我可以毫无问题地修改公共/私人安排。再次感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-07-14
  • 1970-01-01
  • 2016-07-29
  • 1970-01-01
  • 2013-06-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多