#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 .