模板類中如何定義友元函數?


今天看到一個算法題,就是如果有兩個大整數求和,但是這兩個大整數的取值范圍超過了計算機能表示的范圍,要怎么辦?

正好之前看了線性表的順序存儲結構,覺得可以將大整數的每一位存儲到數組中,然后對數組進行對應位的計算!線性表的順序存儲結構的

實現可以看我的前面的博客,有介紹。現在要寫一個大整數求和的算法,即用兩個線性表進行相加,所以要將這個算法函數聲明為順序表類的友元函數,

以此來讀取類的私有成員!具體實現如下:

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;

};  

如上修改之后,順利通過編譯!

運行結果如下:

結果正確。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM