2011-11-10 86 views
2

这是我的头文件,其数组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的代码行。

+0

我不一定会说你使用C++ 11功能做错了什么,除非你的老师明确告诉你不要。 – ildjarn

+1

阅读警告。它告诉你应该使用什么编译器选项来完成这项工作。而不是'g ++ ...','g ++ -std = C++ 0x ...'。 –

回答

0

到这里看看:http://en.wikipedia.org/wiki/C%2B%2B11#Initializer_lists

这是OK,警告只是告诉你,你正在使用新的C++的功能,但编译器没有被告知,以便在命令行。编译器希望您在命令行上告诉他您的代码是按照新的C++标准编写的。

+0

一个人怎么做? –

+0

'g ++ -std = C++ 0x [选项/文件的其余部分]'会起作用。 – matthias

0

您正试图在创建初始化程序列表后一次将其分配给该变量。正如错误消息所指出的那样,直到最近对C++所做的更改仅在很短时间之前才得到批准,可能在编译器创建完成之后才会被允许。

令人怀疑你是否真的想要在你的课堂中内置一堆数据。更常用的方法是将数据作为参数传递给构造函数。创建该对象的代码将拥有一个数组,该数组在您的示例中已初始化,并将该数组传递给构造函数。构造函数会做一个副本。

2

如果你只限于使用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)。

相关问题