zoukankan      html  css  js  c++  java
  • 模板类中如何定义友元函数?

    今天看到一个算法题,就是如果有两个大整数求和,但是这两个大整数的取值范围超过了计算机能表示的范围,要怎么办?

    正好之前看了线性表的顺序存储结构,觉得可以将大整数的每一位存储到数组中,然后对数组进行对应位的计算!线性表的顺序存储结构的

    实现可以看我的前面的博客,有介绍。现在要写一个大整数求和的算法,即用两个线性表进行相加,所以要将这个算法函数声明为顺序表类的友元函数,

    以此来读取类的私有成员!具体实现如下:

    template<class T>// 定义模板类
    class SeqList
    {
    public:
             ...   
        SeqList(int a, int n);                // 有参构造函数,通过大整数建立一个长度为n的顺序表
            ...
        friend SeqList<T> Add(SeqList<T> &A, SeqList<T> &B);// 大整数求和算法
    private:
        T data[MaxSize];
        int Length;
    
    };  
    // 构造函数,将大整数的每一位存到数组中,数组低位放置整数的高位    
    template<class T>
    inline SeqList<T>::SeqList(int a, int n)
    {
        for (int i = n - 1; i >= 0; i--)
        {
            data[i] = a % 10;
            a /= 10;
        }
        Length = n;
    }
    // 具体算法  ,结果放入表A中
    template<class T>
    SeqList<T> Add(SeqList<T> &A, SeqList<T> &B)
    {
        int flag = 0;    // 进位标记
        int i = 0;        // 位数
        int n = A.Length;
        int m = B.Length;
        while (i < n && i < m)
        {
            A.data[i] = (A.data[i] + B.data[i] + flag) % 10;    // 计算第i位的值
            flag = (A.data[i] + B.data[i] + flag) / 10;        // 计算第i位的进位
            i++;
        }
        // 计算大整数A余下的部分
        for (; i < n; i++)
        {
            A.data[i] = (A.data[i] + flag) % 10;
            flag = (A.data[i] + flag) / 10;
        }
        // 计算大整数B余下的部分
        for (; i < m; i++)
        {
            A.data[i] = (B.data[i] + flag) % 10;
            flag = (B.data[i] + flag) / 10;
        }
        int d = (n > m) ? n : m;
        if (flag == 1)
        {
            A.data[d] = 1;
            A.Length=d+1;
        }
        return A;
    }
    int main()
    {    
        int a = 12345678;
        int b = 123456789;
        SeqList<int> aa(a,8);// 模板类实例化
        SeqList<int> bb(b,9);
        SeqList<int> D=Add(aa, bb);
        D.printlist();
        system("pause");
        return 0;
    }

    写完编译,出错!

    感觉写的很对,怎么错了呢??找错吧。。。

    于是百度找资料,翻一翻C++ primer,终于发现问题:

    函数Add并不是一个模板函数,而下面却用模板函数定义

    于是进行修改,修改如下:

    template<class T>// 定义模板类
    class SeqList
    {
    public:
             ...   
        SeqList(int a, int n);                // 有参构造函数,通过大整数建立一个长度为n的顺序表
            ...
        template<class T>    
        friend SeqList<T> Add(SeqList<T> &A, SeqList<T> &B);// 大整数求和算法
    private:
        T data[MaxSize];
        int Length;
    
    };  

    如上修改之后,顺利通过编译!

    运行结果如下:

    结果正确。

  • 相关阅读:
    删除 AP 发票相关脚本
    js框架简明
    16 款最流行的 JavaScript 框架
    八款你不得不知的开源前端JS框架
    ExtJS面向对象
    js6类和对象
    js模拟类
    js实现继承
    Html中各种空格的显示
    常用快速原型设计工具大比拼、原型设计工具哪个好用
  • 原文地址:https://www.cnblogs.com/smile233/p/8075521.html
Copyright © 2011-2022 走看看