Я хочу объявить длину переменной-члена массива, используя постоянную статическую переменную класса. Если я сделаю:
// 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 в каждой единице перевода, в которую включен заголовок.
Есть ли способ указать длину массива с помощью статической переменной класса?
LENGTH
ниже первого его использования. - person Algirdas Preidžius   schedule 13.06.2017LENGTH
, определенное в заголовке (и над определением массива); без него размер экземпляраA
недоступен никому, кромеA.cpp
, что делает невозможным создание экземпляра вашего класса кем-либо еще (в противном случае как они узнают, сколько памяти следует зарезервировать для экземпляра?). Вы пытались определить его в соответствии с рекомендациями здесь? Это для массивов в стиле C, но это та же идея; вам нужно иметь определенное значение дляLENGTH
, чтобы использовать его в качестве константы времени компиляции. - person ShadowRanger   schedule 13.06.2017