当前位置: 首页 > news >正文

类模板的友元

C++的泛型编程真的是复杂,最近再看一些代码的时候涉及一些模板相关的地方,有的写法因为自己没咋用过看着就很陌生,这节就聊聊类模板的友元的各个形式写法。

有关模板的文章之前写过一个可变参数的,感兴趣的可以看看 C++泛型编程:可变参数模板_​​​​​​

先来看下普通类作为类模板的友元 

写之前给不知道友元的小伙伴说一声:友元不受public/private影响,他只是定义在类外部的普通函数或类,可以访问类中private成员;友元声明只能出现在类定义中 ,在外面去定义实现

这是一个普通类的写法

template<class T>
class Base{
private:
	T _id;   
    friend class A;
};

class A{
public:
    void fun1(){
        Base<int>base;
        base._id=1;
        cout<<base._id<<endl;
    }
};

int main()
{
    A a;
    a.fun1();
    return 0;
}
 

除了上面最普通的,还有3种情况

  • 特化版类模板作为另外一个类模板的友元
  • 泛化版类模板作为另一个类模板的友元

 特化版类模板作为另外一个类模板的友元

template<typename TT> class A;

template<typename T>
class Base{
private:
	T _id;   
    friend A<double> ;//double版的A才有权限
};

template<typename TT>
class A{
public:
    void fun1(){
        Base<double>base;
        base._id=2.50;
        cout<<base._id<<endl;
    }
};

int main()
{
    A <double>a;//必须和Base中friend指定的参数一致
    a.fun1();

    A<int> aa;//这样int型的就不行了
    aa.fun1();

    return 0;
}
 

泛化版类模板作为另一个类模板的友元

template<typename TT> class A;

template<typename T>
class Base{
private:
	T _id;   
    template<typename TT> friend class A ;
};

template<typename TT>
class A{
public:
    void fun1(){

        Base<int>base;
        base._id=2.50;
        cout<<base._id<<endl;
    }
    
};

int main()
{
    //都能调了
    A <double>a;
    a.fun1();

    A<int> aa;
    aa.fun1();

    return 0;
}
 

 类类型参数做类模板的友元 

template<typename T>
class Base {    
private:
    //T _id;
    void Print() {
        cout << "this is Base" << endl;
    }
    friend T;
};

class A {   
public:
    //  Base<A>base;//放成成员对象或者函数里都可以
    void fun1() { 
        Base<A>base;
        cout <<"this is A" << endl;
        //base._id=10;//看编译器了,因为相当于A类型转成int,发生隐式转换
        //有的编译器不行就要重载=
        base.Print();
    }
};
int main()
{
    A a;
    a.fun1();
    return 0;
}

相关文章:

  • 全国疫情最新消息今日情况/亚马逊seo推广
  • 阿拉伯语网站/会计培训机构排名
  • 网站月流量是什么意思/友情链接方面
  • 杭州做网站设计公司/关键字挖掘爱站网
  • 专业网站建设加工/谷歌seo教程
  • 做网站收会员费违法吗/淘宝关键词查询工具哪个好
  • Kettle源码启动运行
  • 独立产品灵感周刊 DecoHack #044 - 新的一年如何管理你的时间
  • opencv开发之numpy使用
  • 9.6 容器适配器
  • MATLAB算法实战应用案例精讲-【图像处理】小目标检测(补充篇)(附python代码实现)
  • chrono_duration(一)
  • 《Linux Shell脚本攻略》学习笔记-第一章
  • [LeetCode]-动态规划-3
  • Cadence OrCAD: 跨页符和电源符号命名优先级的一个小问题
  • LeetCode分类刷题----哈希表篇
  • 2023牛客寒假算法基础集训营1(10/13)
  • centos7源码编译tensorflow2.10.0