如何在c ++中从友元类访问私有静态方法

时间:2018-04-25 06:04:46

标签: c++ dllimport

我试图从朋友类访问私有静态方法但是收到LINK错误。访问任何其他privte非静态成员和方法工作正常。

注意:对于一般未解析的符号,此问题(DLL确实包含实现,我们确实与其库链接)。符号DOES存在于DLL中,但它被公开为私有' (如果我在dependency-walker中检查它),而链接器正在寻找公共' (如果我检查链接器报告的装饰名称)。我认为问题在于链接器在尝试解析私有静态方法时似乎忽略了友谊。

e.g:

class CA
{
    friend class CMyFriend;
private:
    static void TestedFunc();
};

class CMyFriend
{
public:
    static void Tester()
    {
        CA::TestedFunc();
    }
};

1 个答案:

答案 0 :(得分:1)

这可能是一个难题,但您可以稍微重新设计一下类以使用私有静态代理对象和公共方法:

标题

class CA
{
    friend class CMyFriend;
private:
    class CAProxy final {
    friend class CA;
    private:
        CAProxy(){}
    };
    static CAProxy proxy;
    static void TestedFunc();
public:
    static void TestedFunc(const CAProxy& proxy); // This just calls TestedFunc();
};

<强>实施

CA::CAProxy CA::proxy{};

void CA::TestedFunc(const CAProxy& proxy) {
    TestedFunc();
}

void CA::TestedFunc() {
    // your code...
}

<强>呼叫者

class CMyFriend
{
public:
    static void Tester()
    {
        CA::TestedFunc(CA::proxy);  // This will call the public method
    }
};

因为公共方法需要对除CA本身之外的任何人都无法实例化的对象的引用,并且因为静态实例CA::proxy是私有的并且只有朋友可以访问,所以只有朋友才能调用此方法公共方法。