include_all 2015-11-19 12:26 采纳率: 0%
浏览 1645

C++重载类型转换的问题

这是c++哈夫曼树的代码template class HfmTree : public BinaryTree //哈夫曼树类 { public: operator T() const{ return weight; } //重载类型转换符,T a;HfmTree b;a=b;//b是HfmTree类型直接转换成T类型,赋值给a T getW(){ return weight; } //返回weight void putW(const T&x){ weight = x; } //确定weight的值 void SetNull(){ root = NULL; } //置空二叉树private: T weight; }; template HfmTree CreateHfmTree(T w[],char q[],int n) //构造哈夫曼树 { PrioQueue > pq(n); //声明优先队列 HfmTree x, y, z, zero; for(int i = 0; i < n; i++) { z.MakeTree(w[i], q[i], x ,y); //继承,使用父类的函数,这里每个新建的二叉树都只有空的子树和一个根节点 z.putW(w[i]); pq.Append(z);//进堆操作 z.SetNull(); }//for循环结束后,已经按照最小堆构建好了 for(i = 1; i < n; i++) { pq.Serve(x); pq.Serve(y); z.MakeTree(x.getW() + y.getW(), 'e', x, y); z.putW(x.getW() + y.getW()); pq.Append(z); z.SetNull(); }//构造哈夫曼树 pq.Serve(z); return z; } 这是优先权队列的代码template class PrioQueue //优先权队列类 { public: PrioQueue(int mSize = 20); ~PrioQueue(){ delete []q; } bool IsEmpty() const{ return n == 0; } //判断队列是否为空 bool IsFull() const{ return n == maxSize; } //判断队列是否满了 void Append(const T&x); //进队列 void Serve(T&x); //出队列private: void AdjustDown(int r, int j); void AdjustUp(int j); T *q; int n, maxSize; }; template PrioQueue::PrioQueue(int mSize) { maxSize = mSize; n = 0; q = new T[maxSize]; } template void PrioQueue::AdjustUp(int j) //向上调整,j是队列中最后元素的下标 { int i = j; T temp = q[i]; while (i > 0 && temp < q[(i - 1) / 2]) { q[i] = q[(i - 1) / 2]; i = (i - 1) / 2; } q[i] = temp; } template void PrioQueue::Append(const T&x) //插入新元素 { if(IsFull()) { cout << "Overflow" << endl; return; } q[n++] = x; AdjustUp(n-1); } template void PrioQueue::Serve(T&x) //删除堆顶元素 { if(IsEmpty()) { cout << "Underflow" << endl; return; } x = q[0]; q[0] = q[--n];//将堆底元素放到堆顶 AdjustDown(0, n-1); } template void PrioQueue::AdjustDown(int r,int j) //向上调整,r是堆顶元素,j是堆底元素 { int child = 2 * r + 1; T temp = q[r]; while(child <= j) { if((child < j) && (q[child] > q[child+1]))//找到左右子树中较小的 child++; if(temp <= q[child]) break; q[(child - 1) / 2] = q[child]; child = 2 * child + 1; } q[(child - 1) / 2] = temp; } 关键就在构造哈夫曼树时,传进队列中去的是HfmTree类型的数据,但是队列处理的是T类型的数据,如果operate T()这个成员函数是按照我注释那样写的,那存进去的应该是weight的值,怎么取出来还能当HfmTree的数据使用?求解答,这个问题困扰我很久了。

  • 写回答

1条回答 默认 最新

  • 普通网友 2015-12-04 02:50
    关注

    ----------------------biu~biu~biu~~~在下问答机器人小D,这是我依靠自己的聪明才智给出的答案,如果不正确,你来咬我啊!

    评论

报告相同问题?

悬赏问题

  • ¥15 #MATLAB仿真#车辆换道路径规划
  • ¥15 java 操作 elasticsearch 8.1 实现 索引的重建
  • ¥15 数据可视化Python
  • ¥15 要给毕业设计添加扫码登录的功能!!有偿
  • ¥15 kafka 分区副本增加会导致消息丢失或者不可用吗?
  • ¥15 微信公众号自制会员卡没有收款渠道啊
  • ¥100 Jenkins自动化部署—悬赏100元
  • ¥15 关于#python#的问题:求帮写python代码
  • ¥20 MATLAB画图图形出现上下震荡的线条
  • ¥15 关于#windows#的问题:怎么用WIN 11系统的电脑 克隆WIN NT3.51-4.0系统的硬盘