2012-04-26 112 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>传入的类型,所以它现在不匹配。我无法分辨您的物品声明或传递给新物品的类型是否是您的意思,但传递给新物品的物品比物品具有更多的间接层次。