C++ 友元跨命名空间使用
以+
运算符重载为例:
#include <iostream>
#include <string>
// 前置声明是必须的
namespace mydog
{
class Dog;
}
namespace myadd
{
mydog::Dog operator+(const mydog::Dog dog1, const mydog::Dog dog2);
}
namespace mydog
{
class Dog
{
friend Dog myadd::operator+(const Dog dog1, const Dog dog2);
private:
std::string name{ "小黑" };
int age{ 2 };
public:
void show()
{
std::cout << "名字:" << name << " " << "年龄:" << age << '\n';
}
Dog() = default;
Dog(const std::string &n, int a):name{n}, age{a}{}
};
}
mydog::Dog myadd::operator+(const mydog::Dog dog1, const mydog::Dog dog2)
{
mydog::Dog my_dog_add;
my_dog_add.age = dog1.age + dog2.age;
my_dog_add.name = dog1.name + "+" + dog2.name;
return my_dog_add;
}
int main()
{
using mydog::Dog;
Dog dog1("小花", 3);
Dog dog2;
using myadd::operator+; // 必须不然找不到函数,或者直接 using namespace myadd;加入命名空间
Dog addDog = dog1 + dog2;
addDog.show();
system("pause");
return 0;
}
输出:
名字:小花+小黑 年龄:5
类型的前置声明貌似是必须的,不然编译器好像连接不到。
另外,友元关系不继承,且与放到private或public无关。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
2022-11-14 log4net 的简单配置