Инициализация массивов-членов класса в конструкторах классов?

#c

#c

Вопрос:

Вот мой заголовочный файл с массивом, Data который мой учитель хочет инициализировать в Heap конструкторе.

 #ifndef HEAP_H
#define HEAP_H

class Heap
{
private:
    int Data [100];
    int Parent(int);
    int RightChild(int);
    int LeftChild(int);
    void Heapify(int*, int);
    void BuildHeap(int*);

public:
    Heap();
    void insert(int*);
    void HeapSort(int*);
    void ExtractMaximum(int*);
    int Maximum(int*);
    void PrintHeap(int*);
    int heapsize;
    int* GetData();
};

#endif
  

Конструктор здесь:

 Heap::Heap()
{
    Data = {4, 12, 3, 19, 23, 5, 32, 11, 2, 24}; 
    heapsize = 10;
    BuildHeap(Data); //build a heap with initial values
}
  

Всякий раз, когда я запускаю код с первой строкой кода в конструкторе, инициализируя массив, я получаю следующее предупреждение:

Предупреждение: расширенные списки инициализаторов доступны только с -std=c 0x или -std=gnu 0x

Очевидно, я делаю что-то неправильно, и это единственная ошибка / предупреждение, которое у меня есть с этим кодом, и оно запускается, когда я убираю строку инициализирующего кода Data .

Комментарии:

1. Я бы не сказал, что вы делаете что-то неправильно, используя функции C 11, если только ваш учитель специально не сказал вам этого не делать.

2. Прочитайте предупреждение. Это говорит вам, какую опцию компилятора вы должны использовать, чтобы заставить это работать. Вместо g ... , g -std=c 0x ... .

Ответ №1:

Если вы ограничены использованием C 03, то я бы воспользовался этим подходом:

 #include <algorithm>

Heap::Heap()
  : Data() // value-initialize Data so initial elements are 0 instead of random
  , heapsize(10) // initialize here instead of constructor body for consistency
{
    static int const initData[] = { 4, 12, 3, 19, 23, 5, 32, 11, 2, 24 };
    std::copy(initData, initData   sizeof(initData) / sizeof(initData[0]), Data);
    BuildHeap(Data); //build a heap with initial values
}
  

Если вам разрешено использовать функциональность C 11, то то, что у вас есть, более или менее в порядке, вам просто нужно фактически сообщить вашему компилятору, что вы собираетесь использовать функциональность C 11 ( -std=c 0x ).

Ответ №2:

Вы пытаетесь назначить список инициализаторов переменной сразу после ее создания. Как отмечено в сообщении об ошибке, это было запрещено до тех пор, пока недавние изменения в C не были утверждены совсем недавно, вероятно, намного позже создания вашего компилятора.

Сомнительно, что вы действительно хотите иметь консервированную кучу данных, встроенных в ваш класс. Более обычным подходом было бы передать данные в качестве параметров в конструктор. Код, который создает объект, будет иметь массив, который инициализируется, как в вашем примере, и передает этот массив в конструктор. Конструктор сделал бы копию.

Ответ №3:

Взгляните сюда: http://en.wikipedia.org/wiki/C++11#Initializer_lists

Это нормально, предупреждение просто сообщает вам, что вы используете новую функцию C , но компилятору не было сообщено об этом в командной строке. Компилятор хочет, чтобы вы сообщили ему в командной строке (с помощью -std=c 0x ), что ваш код написан в соответствии с новым стандартом C .