2015-01-21 2 views
1

Я хочу иметь массив, доступный для всех функций класса.C++ Указатель массива инициализации Ints

Я поместил массив как приватную переменную в файл заголовка.

private: 
    int* arrayName; 

В файле .cpp, где я реализовать класс, конструктор принимает целочисленное значение (размер) и создает массив. Цель состоит в том, чтобы его заполнить

ClassName::ClassName(int numElements){ 
    arrayName = new int[numElements]; //make arrays the size of numElements 
    for(int i = 0; i<numElements; i++) 
     arrayName[i] = 0; 
} 

Я чувствую, что это довольно неэффективно. Я знаю, что вы можете сделать int array [5] = {0}; но как вы это делаете, когда изначально не знаете размер.

+1

Ваша личная переменная - это всего лишь указатель. Не массив, не указатель на массив. – juanchopanza

+3

Что-то должно обнулить память; будь то вы или библиотечная функция. Невозможно магически нулевать память без повторения ее. –

ответ

6

Если вы хотите нуля, инициализировать массив обновленного вобще значение инициализации его. Это имеет эффект нулевой инициализации его элементов:

arrayName = new int[numElements](); 
//        ^^ 

Но вы действительно хотите быть с помощью std::vector<int>.

private: 
    std::vector<int> vname; 

и

ClassName::ClassName(int numElements) : vname(numElements) {} 

Таким образом, вам не придется беспокоиться об удалении массива и реализации конструкторы копирования и операторы присваивания.

0

Вы можете использовать функцию memset:

memset(arrayName,0,sizeof(int)*numElements); 

Эта функция устанавливает void * memset (void * ptr, int value, size_t num); первые пит байт блока памяти, на который указывает ptr до указанного значения (интерпретируется как беззнаковое полукокса).

Чтобы использовать его, вы должны включить заголовочный файл string.h.

Для получения дополнительной информации: http://www.cplusplus.com/reference/cstring/memset/

0

Что вы хотите сделать, это постепенно расширять массив по требованию.

arrayName = new int[numElements]; 
for(int i = 0; i<numElements; i++) 
     arrayName[i] = 0; 

Приведенный выше код (то, что вы дали) даст вам множество numElements размера, а затем цикл будет заполнить его. Это выделено сейчас и не может, как я понимаю, просто или легко изменить размер (memset будет перезаписывать ранее сохраненные значения в массиве).

Вы можете скопировать весь массив через каждый раз, когда вы хотите, чтобы изменить его размер:

int * oldarr = new int[OldSize]; 
//fill your old array 

int * newarr = new int[NewSize]; 
for(int i = 0; i<OldSize; i++) 
     newarr[i] = oldarr[i]; 

Кроме этого, вы могли бы сделать массив гораздо больше, или вы можете использовать различные ВРЖО, такие как станд :: вектор. Вектор может быть увеличен с помощью простой функции push_back и позволяет доступ к [] оператору (например, arr [5] и еще что-то).

Надеюсь, это поможет!

Смежные вопросы