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: «'LENGTH' не была объявлена ​​в этой области» при объявлении 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;
};

Но, как я понимаю, сначала это две разные переменные: LENGTH области видимости глобального пространства имен и LENGTH области видимости класса. Кроме того, объявление переменной в .h (вне класса A) создаст независимый объект LENGTH в каждой единице перевода, в которую включен заголовок.

Есть ли способ указать длину массива с помощью статической переменной класса?


person José Otero    schedule 13.06.2017    source источник
comment
почему переменная-член класса ‹...› находится вне области видимости внутри класса Потому что компилятор читает файлы сверху вниз. Если какое-то имя не объявлено в момент, когда оно его видит - возникает ошибка. И, очевидно, LENGTH ниже первого его использования.   -  person Algirdas Preidžius    schedule 13.06.2017
comment
Вероятно, вам понадобится значение LENGTH, определенное в заголовке (и над определением массива); без него размер экземпляра A недоступен никому, кроме A.cpp, что делает невозможным создание экземпляра вашего класса кем-либо еще (в противном случае как они узнают, сколько памяти следует зарезервировать для экземпляра?). Вы пытались определить его в соответствии с рекомендациями здесь? Это для массивов в стиле C, но это та же идея; вам нужно иметь определенное значение для LENGTH, чтобы использовать его в качестве константы времени компиляции.   -  person ShadowRanger    schedule 13.06.2017
comment
@Algirdas Preidžius, вы правы, мне сначала пришлось указать ДЛИНУ.   -  person José Otero    schedule 13.06.2017
comment
@Vlad из Москвы, вы были правы, мне нужно было сначала поставить ДЛИНУ.   -  person José Otero    schedule 13.06.2017
comment
@ShadowRanger, спасибо за информацию, мне нужно закончить кодирование, и я посмотрю на вашу ссылку.   -  person José Otero    schedule 13.06.2017


Ответы (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.

Если это общедоступное / частное расположение плохо для вас, знайте, что вы можете включить несколько общедоступных / частных индикаторов в заголовок класса.

person Richard    schedule 13.06.2017
comment
Большое спасибо, Ричард, это помогает. Между прочим, я могу без проблем изменить публичное / частное расположение. Спасибо еще раз. - person José Otero; 13.06.2017