【问题标题】:Overloading the assignment operator C++重载赋值运算符 C++
【发布时间】:2012-04-26 20:30:54
【问题描述】:

家庭作业要求重载 Heap 类的寄售运算符,该类用于在每个节点存储指向队列的指针,以尝试模拟急诊室优先级队列。

到目前为止,这是我想出的代码:

    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 =

items 在头文件中声明如下:

    queue<T>* items[MAX_HEAP];

并且是标准库队列的一个实例。

我不太确定我是否使用正确的语法来创建一个新的动态队列指针数组。

我收到一条错误消息:

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

关于什么可能导致它以及我如何解决它的任何想法?

【问题讨论】:

  • 要显着减轻疼痛,请使用copy-and-swap idiom
  • 为什么不直接使用std::vector 而不是C 数组和手动内存管理?将标准库类和 C 数组混合在一起是愚蠢的矫枉过正。
  • 堆如何使用队列指针的动态数组?

标签: c++ arrays templates operator-overloading


【解决方案1】:

您已将 items 声明为 std::queue&lt;T&gt; *items[50];。使用std::queue&lt;T&gt; ** items;,或者更好的是std::vector&lt;std::queue&lt;T&gt;&gt; items;

另外,delete * items; 应该是 delete[] items;

编辑 - 我忘了在std::queue 之后添加&lt;T&gt;

【讨论】:

  • 那里打错了,没有向 std::queue 提供类模板类型参数 :)
  • 假设我们使用了std::queue ** items,我们将如何设置动态数组的大小?
  • 通过new 运算符。 new std::queue&lt;T&gt;* [MAX_HEAP] 将返回 std::queue 指针的新动态(类 C!)数组。否则,你不需要new,如果你写std::queue&lt;T&gt;* items[50];,则不需要new[],因为它将使用包含数组的对象创建。
  • 但您可能也不希望这样。我从未见过一个指向队列的指针数组的堆。为什么有 50 个?
【解决方案2】:

new 返回一个指向传入类型的指针,因此它现在不匹配。我不知道您对 items 的声明还是传递给 new 的类型是您的意思,但是传递给 new 的声明比 items 多了一层间接性。

【讨论】:

    猜你喜欢
    • 2013-03-30
    • 2016-08-30
    • 1970-01-01
    • 2018-12-27
    • 2012-04-22
    • 2015-06-01
    • 2012-08-17
    • 2011-01-27
    • 2011-05-31
    相关资源
    最近更新 更多