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无关。

posted @   double64  阅读(9)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
历史上的今天:
2022-11-14 log4net 的简单配置
点击右上角即可分享
微信分享提示