Как я должен использовать массивы в качестве члена класса в C ++? - PullRequest
0 голосов
/ 16 марта 2020

Мне нужно использовать массив в качестве свойства класса, но я не уверен в правильности пути. Предположим, что у меня есть класс с именем A, и мне нужен целочисленный массив.

  • Во-первых, если мне нужен массив stati c с 10 элементами, выполните следующие действия. правильный? Если нет, то как это должно быть?

    class A {
    public:
        int arr[10];
    };
    
  • Во-вторых, если я хочу массив динамических c, какое из следующих утверждений является правильным? Если ни один из них, я был бы признателен, если вы объясните причину и правильный путь.

    class A {
    public:
       int *arr;
    };
    
    class A {
    public:
       int arr[];
    };
    
  • Наконец, что произойдет, если я инициализирую свойство в определении класса следующим образом

    class A {
    public:
        int arr[] = {1,2,3};
        // or
        int *arr = new int[5];
        // or 
        int number = 5;
    };
    

Большое спасибо.

Примечание: я знаю, что гораздо лучше использовать vector или такую ​​структуру данных STL, но я нужно как-то придерживаться массивов.

Ответы [ 2 ]

3 голосов
/ 16 марта 2020

Во-первых, если мне нужен массив stati c с 10 элементами, правильный ли следующий способ?

Да, это правильный путь.

Некоторые люди предпочитают заключать массив в шаблон класса, такой как std::array.

Во-вторых, если я хочу динамический массив c, какое из следующих утверждений является правильным? Если ни один из них, я был бы признателен, если бы вы объяснили причину и правильный путь.

class A {
public:
   int arr[];
};

Это неверно сформулированное заявление. Элемент не может быть массивом неопределенной длины.

class A {
public:
   int *arr;
};

Это верно как таковое, но не создан динамический c массив. Использование этого для владения динамическим c массивом - плохой дизайн, потому что голые указатели никогда не должны иметь владельца.

Даже для указания массива, хранящегося в другом месте, это проблематично c, так как класс не знает о длине массива.

Это был бы правильный путь, предполагая, что массив принадлежит классу:

class A {
public:
   std::vector<int> arr;
};

Если массив не принадлежит классу, то правильное следующее :

class A {
public:
   std::span<int> arr;
};

std::span не входит в стандарт до C ++ 20, поэтому до тех пор вам нужно прибегнуть к нестандартной реализации.

Наконец , что произойдет, если я инициализирую свойство в определении класса следующим образом

class A {
public:
    int arr[] = {1,2,3};

Это неправильно сформировано, поскольку размер члена не может быть определен из инициализатора.

int *arr = new int[5];

new int[5] - инициализатор элемента по умолчанию. В противном случае он будет использоваться, если для члена не предоставлен инициализатор.

1 голос
/ 16 марта 2020

Для массивов фиксированного размера вы можете использовать int arr[10] или std::array<int, 10>.

Для массивов динамического размера или с изменяемым размером, если вы не можете использовать std::vector или std::unique_ptr<int[]>, вы должны использовать int* ( int[] не является допустимым типом данных в C ++) и реализует конструктор, конструктор копирования, конструктор перемещения, назначение копирования, назначение перемещения и деструктор. См. правило пяти для получения более подробной информации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...