You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让两个类私有访问Rectangle的paint方法且不引入依赖?

解决Rectangle私有方法仅让Foo和Bar访问且互不依赖的问题

方案一:引入中间权限代理类

通过一个中间类作为权限中转,让Rectangle只信任这个代理类,再由代理类分别授权给Foo和Bar。这样Foo和Bar无需知晓彼此的存在。

代码实现:

// Rectangle.h
class RectangleAccess;

class Rectangle {
private:
    void paint() {}
    // 仅让代理类访问私有方法
    friend class RectangleAccess;
};

// RectangleAccess.h
// 只需前向声明Foo和Bar,无需包含它们的头文件
class Foo;
class Bar;

class RectangleAccess {
private:
    // 封装对Rectangle::paint的调用
    static void callPaint(Rectangle& rect) {
        rect.paint();
    }
    // 分别授权给Foo和Bar
    friend class Foo;
    friend class Bar;
};

// Foo.h
#include "Rectangle.h"
#include "RectangleAccess.h"

class Foo {
public:
    void operateRectangle(Rectangle& rect) {
        // 通过代理类间接调用私有方法
        RectangleAccess::callPaint(rect);
    }
};

// Bar.h
#include "Rectangle.h"
#include "RectangleAccess.h"

class Bar {
public:
    void operateRectangle(Rectangle& rect) {
        RectangleAccess::callPaint(rect);
    }
};

方案二:模板特化+独立友元声明

针对Foo和Bar分别特化Rectangle模板,在特化版本中同时声明对方为友元。Rectangle的头文件只需前向声明两个类,避免Foo和Bar互相依赖。

代码实现:

// Rectangle.h
// 前向声明Foo和Bar,无需包含头文件
class Foo;
class Bar;

// 基础模板,默认无友元
template <class T>
class Rectangle {
private:
    void paint() {}
};

// 针对Foo的特化版本,同时允许Foo和Bar访问
template <>
class Rectangle<Foo> {
private:
    void paint() {}
    friend class Foo;
    friend class Bar;
};

// 针对Bar的特化版本,同时允许Foo和Bar访问
template <>
class Rectangle<Bar> {
private:
    void paint() {}
    friend class Foo;
    friend class Bar;
};

// Foo.h
#include "Rectangle.h"

class Foo {
public:
    void useRectangle() {
        Rectangle<Foo> rect;
        rect.paint(); // 合法访问
    }
};

// Bar.h
#include "Rectangle.h"

class Bar {
public:
    void useRectangle() {
        Rectangle<Bar> rect;
        rect.paint(); // 合法访问
    }
};

方案对比

  • 方案一更灵活:后续若需新增有权限的类,只需在RectangleAccess中添加friend声明,无需修改Rectangle类本身。
  • 方案二更直接:无需额外代理类,但如果有权限的类数量增加,特化版本会增多,维护成本上升。

内容的提问来源于stack exchange,提问作者Yakov Dan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 21:55:34