c++ - 允许 "friend"类仅访问一些私有(private)成员

标签 c++ friend

假设我有三个 C++ 类 FooA、FooB 和 FooC。

FooA 有一个名为 Hello 的成员函数,我想在 FooB 类中调用该函数,但我不希望 FooC 类能够调用它。我能想出实现这一点的最好方法是将 FooB 声明为 FooA 的 friend 类。但只要我这样做,所有 FooA 的私有(private)成员和 protected 成员都会暴露出来,这对我来说是非常 Not Acceptable 。

所以,我想知道 C++(03 或 11)中是否有比 friend 类更好的机制来解决这个难题。

如果可以使用以下语法,我认为会很好:

class FooA
{
private friend class FooB:
    void Hello();
    void Hello2();
private:
    void Hello3();
    int m_iData;
};

class FooB
{
    void fun()
    {
        FooA objA;
        objA.Hello()  // right
        objA.Hello2() // right
        objA.Hello3() // compile error
        ojbA.m_iData = 0; // compile error
    }
};

class FooC
{
    void fun()
    {
        FooA objA;
        objA.Hello()  // compile error
        objA.Hello2() // compile error
        objA.Hello3() // compile error
        ojbA.m_iData = 0; // compile error
    }
};

最佳答案

没有什么可以让一个类成为一个特定函数的 friend ,但是你可以让 FooB 成为一个具有私有(private)构造函数的“关键”类的 friend ,然后让 FooA::Hello 将该类作为忽略的参数。 FooC 将无法提供参数,因此无法调用 Hello:

Is this key-oriented access-protection pattern a known idiom?

关于c++ - 允许 "friend"类仅访问一些私有(private)成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16055616/

相关文章:

c++ - Flag 检查编译器是 gcc/mingw 还是 VC++ cl?

vb.net - 为 VB.NET 项目设置项目默认值,以便控件的默认修饰符属性为 Private

c++ - 如何访问单独类中的私有(private)构造函数?

c++ - 没有歧义的命名空间规范

c++ - 尝试从源构建 Qt 会导致错误

c++ - 使用 LLVM JIT 代码对程序进行编码以调用 C++ 代码

c++ - 友元运算符行为(const vs non-const)

c++ - 如何锁定由属于 2 个不同类的 2 个线程修改的数据结构

c++ - 减少重复的方法?

c++ - 是否可以调用注入(inject)的 friend 模板函数?