Для определения переменной используйте:
A::data * A::struct_ptr = new data[100];
Обратите внимание на A::
перед обоими (первым) data
и struct_ptr
.Если вы удалите любой префикс, компиляция не удастся.С обоими префиксами он компилируется.
Также обратите внимание, что если вы выделите массив в конструкторе, у вас будет утечка памяти.Вы будете выделять новый массив каждый раз, когда создаете объект типа A
.
. Кроме того, у вашего конструктора есть проблема, заключающаяся в том, что он оставляет struct_ptr
, указывающий на элемент после конца выделенного массива.Позже вы получаете доступ к struct_ptr
, как если бы он указывал на начало массива.Это не сработает.
Другой вариант - изменить str_ptr
на функцию и поместить туда статическую переменную.Это может быть что-то вроде:
A::data * A::str_ptr()
{
static data * const array = new data[100];
return array;
}
Возможно, это можно улучшить, в зависимости от того, как вам действительно нужно использовать этот указатель.Может быть удобно передать индекс и заставить функцию возвращать элемент с этим индексом.
Возможно, вы также захотите определить класс, который воплощает массив данных, чтобы он мог позаботиться об инициализации.Таким образом, у вас не будет инициализации несколько раз, и вам не нужно отслеживать, что вы инициализировали.(По крайней мере, определение указателя как const
предотвращает изменение его значения на неожиданное значение.)