2012-04-26 124 views
0

作業分配要求爲Heap類重載寄售操作符,該類用於存儲指向每個節點上的隊列的指針,以嘗試模擬應急空間優先級隊列。重載賦值運算符C++

到目前爲止,這裏是代碼,我想出了:

template <typename T> 
    Heap<T>& Heap<T>::operator=(const Heap<T> & rhs) 
    { 
     //check for self-assignment 
     if(this != &rhs) 
     { 
      //delete memory 
      for(int i = 0; i < MAX_HEAP; i++) 
      { 
       //delete queue at position i, set pointer to NULL 
       delete items[i]; 
       items[i] = NULL; 
      }//end for 
      delete * items; 

      //create new memory to hold copy of rhs 

         //error occurs here 
      items = new queue<T> *[MAX_HEAP] ; 

      for(int i = 0; i < MAX_HEAP; i++) 
       items[i] = rhs.items[i]; 

      //assigns new stuff to this heap 
      size = rhs.size; 
      nodes = rhs.nodes; 

     }//end if 
     return *this; 
    }//end = 

的項目在頭文件中聲明爲這樣:

queue<T>* items[MAX_HEAP]; 

和標準庫隊列的一個實例。

我不太清楚如果我使用正確的語法來創建一個新的動態數組隊列指針。

我得到一個錯誤,指出:

error C2440: '=' : cannot convert from 'std::queue<_Ty> **' to 'std::queue<_Ty> *[50]' 

任何想法,以什麼可能導致它,我該怎麼解決呢?

+2

對於顯着更少的痛苦,請使用[copy-and-swap idiom](http://stackoverflow.com/questions/3279543/what-is-the-copy-and-swap-idiom)。 – 2012-04-26 20:34:04

+1

爲什麼不只是使用'std :: vector'而不是C數組和手動內存管理?將標準庫類和C數組混合在一起是愚蠢的矯枉過正。 – Griwes 2012-04-26 20:34:29

+0

堆將如何使用隊列指針的動態數組? – 2012-04-26 20:43:43

回答

1

您已將items宣佈爲std::queue<T> *items[50];。使用std::queue<T> ** items;,或者更好的,std::vector<std::queue<T>> items;

此外,delete * items;delete[] items;

編輯 - 我忘了後std::queue

+0

錯字那裏,沒有提供類模板類型參數爲std ::隊列:) – M3taSpl0it 2012-04-26 20:37:38

+0

假設我們使用std :: queue **項目,我們將如何設置動態數組的大小?通過'new'運算符得到 – D1990c 2012-04-26 20:40:05

+0

。 'new std ::隊列 * [MAX_HEAP]'會返回指向std ::隊列指針的新動態(C-like!)數組。否則,如果你編寫'std ::隊列 * items [50];',就不需要'new',因爲它將用包含數組的對象創建,所以不需要'new []' 。 – nothrow 2012-04-26 20:46:49

0

new返回一個指針加<T>傳入的類型,所以它現在不匹配。我無法分辨您的物品聲明或傳遞給新物品的類型是否是您的意思,但傳遞給新物品的物品比物品具有更多的間接層次。