天天看點

類模闆與友元

01 函數、類、類的成員函數作為類模闆的友元

代碼例子如下:

// 普通函數
void Func1() { } 

// 普通類
class A { }; 

// 普通類
class B 
{
    public:
    void Func() { } // 成員函數
};

// 類模闆
template <class T>
class Tmp
{
    friend void Func1();    // 友元函數
    friend class A;         // 友元類
    friend void B::Func();  // 友元類的成員函數
}; // 任何從 Tmp 執行個體化來的類 ,都有以上三個友元      

02 函數模闆作為類模闆的友元

// 類模闆
template <class T1,class T2>
class Pair
{
private:
    T1 key;   //關鍵字
    T2 value; //值
public:
    Pair(T1 k,T2 v):key(k),value(v) { };

    // 友元函數模闆
    template <class T3,class T4>
    friend ostream & operator<< (ostream & o, const Pair<T3,T4> & p);
};

// 函數模闆
template <class T3,class T4>
ostream & operator<< (ostream & o, const Pair<T3,T4> & p)
{
    o << "(" << p.key << "," << p.value << ")" ;
    return o;
}

int main()
{
    Pair<string,int> student("Tom",29);
    Pair<int,double> obj(12,3.14);

    cout << student << " " << obj;
    return 0;
}      

輸出結果:

(Tom,29) (12,3.14)      

03 函數模闆作為類的友元

// 普通類
class A
{
private:
    int v;
public:
    A(int n):v(n) { }

    template <class T>
    friend void Print(const T & p); // 函數模闆
};

// 函數模闆
template <class T>
void Print(const T & p)
{
    cout << p.v;
}

int main() 
{
    A a(4);
    Print(a);
    return 0;
}      

輸出結果:

4      
// 類模闆
template <class T>
class B 
{
private:
    T v;
public:
    B(T n):v(n) { }

    template <class T2>
    friend class A; // 友元類模闆
};

// 類模闆
template <class T>
class A 
{
public:
    void Func( )  
    {
        B<int> o(10); // 執行個體化B模闆類
        cout << o.v << endl;
    }
};

int main()
{
    A<double> a;
    a.Func ();
    return 0;
}      
10      
上一篇: js易錯筆記

繼續閱讀