3

我有一个 A 类,它有一个名为 a() 的私有方法。我还有一个需要访问 a() 的 B 类(但只有 B 应该可以访问 a(),这就是为什么 a() 是私有的)。我现在可以使用朋友说明符,但这会使 A 的其他私有方法(我们称它们为 b() 和 c())也可用于 B,我不希望这种行为。

有没有办法让 B 可以访问 A 的 a()?

4

4 回答 4

4

有一种方法——如果你的类有一个公共模板函数:

class A {
    // apparently private
    void priv () { std::cout << "got you A::a()" << std::endl ; }
public:
    template <class T> 
    void abuse() {}
    };


struct Thief {};

template <>
void A::abuse<Thief>() {
    this->priv();
    }

int main() {
    A a;
    // obviously do not compile :   a.priv();
    // this i OK
    a.abuse<Thief>();

    return 0;
    }

我必须承认这是我从 GotW 那里偷来的……

于 2012-01-02T18:47:08.230 回答
1

不,没有,但是当您指定精确的类时,只有 B 可以访问 A 的私有成员。你只需要注意调用什么方法。

由于没有继承朋友关系,您不必担心 B 可能的子类。

于 2012-01-02T12:39:09.490 回答
0

这可以通过一些“扭曲”来完成。

只需将 A 类中的方法 a() 分解为以 B 作为友元类的父类,然后让 A 继承它。这将使 a() 成为 A 中的一个方法,但它是其父母的朋友 B 可以访问的唯一私有方法。

这是一个非常简单的代码来澄清我所说的:

class parent
{
    friend class B;
private:
    void a() {}
};

class A:public parent
{
private:
    void b() {}
    void c() {}
};


class B
{
    A* m_a;
public :
    B() 
    {
        m_a = new A();
        m_a->a(); // OK
        m_a->b(); //  error C2248: 'A::b' : cannot access private member declared in class 'A'

    }
};

希望能帮助到你 !

于 2012-01-02T12:57:12.917 回答
0

是的,我有一个简单的方法。让 B 有一个 A::a() 的指针,像这样:

typedef boost::function<void ()> functype;

class A {        
private:
    void a();
};

class B {
public:
    void setfp(functype f) {m_f = f;}
    void foo() {
        // do some stuff
        m_f();
    }
private:
    functype m_f;
};

A a;
B b;
b.setfp(boost::bind(&A::a, &a));
b.foo();
于 2012-01-02T14:22:10.017 回答