使用friend作为“namespace-private”字段或方法

时间:2015-09-02 13:21:22

标签: c++ oop namespaces friend

我有一个基本上与this one完全相反的问题。

正如我们在this post中所看到的,Java确实有一种比C ++更多的访问模式:包一 在我的代码中,我想创建一个只有其他类可以从其自己的命名空间实例化和使用的类,而不是在外部。所以它看起来像Java“包 - 隐私访问”的情况,但这个选项在C ++中不可用。

UML Diagram

我实现它的想法是将构造函数/析构函数和此类的大多数方法设为privateprotected,并使用{{1}来访问同一名称空间中的其他类。 }关键字 但是,几乎在论坛上的所有地方,就像我与其他C ++程序员的个人会谈一样,friend被认为是一个邪恶的关键词,它会破坏每个OOP概念,永远不会被使用。

在这种精确的情况下使用它是否足够?或者没有使用friend的其他解决方案吗?

1 个答案:

答案 0 :(得分:0)

当您使用friend时,您无法限制对私密内容的访问(例如成员变量)。

我可能有更好的解决方案。 您可以使用私有构造函数定义一个结构,该构造函数定义了"包中的所有类"作为朋友。 然后,从包外部更改要限制访问的类的构造函数,以获取对该对象的引用。

#include <iostream>
#include <vector>


struct code_unlocker
{
    friend struct A;
    friend struct B;
    friend struct C;
private:
    code_unlocker() {};
};

struct A
{
    A(const code_unlocker&)  //Restricted: Only callabble by friends of code_unlocker
    {
    };
};


struct B
{
    B(const code_unlocker&)  //Restricted: Only callabble by friends of code_unlocker
    {
        A a = A(code_unlocker());  //Works
    };
};


struct C
{
    C()//Accessible from outside
    {
        B b = B(code_unlocker()); //Works
    };
};

using namespace std;
int main(int, char *[])
{
    A a = A(code_unlocker()); //Doesn't work
    B b = B(code_unlocker()); //Doesn't work
    C c = C(); //Works

}