2011-11-10 240 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)。

相關問題