如何使朋友功能有内部联系

时间:2012-10-24 17:08:38

标签: c++ linker friend

我需要确保声明为某个C ++类的朋友的C ++函数具有内部链接。

我之所以需要函数成为朋友,是因为它需要访问该类的私有成员,这是一个缓存函数结果的私有成员。

函数需要是同一个类的非成员(或者至少不是实例成员)的原因是因为其他代码需要能够获取非成员函数指针。重构这个太贵了。

我需要它具有内部链接的原因是因为会有很多这些函数,并且在AIX上,有太多这些函数会在链接时导致TOC溢出错误。这可以使用-bbigtoc链接器开关来克服,但我暂时试图避免这种情况。

另外,我真的希望能够在头文件中保留类声明,但是将函数本身放在包含实现的.cxx文件中。

总结一下,现在我有这样的事情:

class Foo
{
    private:
        mutable Qux cachedBarResult;
    // ... more code here ...
    public:
        friend const Qux & Bar(const Foo &);
};

const Qux & Bar(const Foo & foo)
{
    if (foo.cachedBarResult.isEmpty())
    {
        foo.cachedBarResult = _worker_Bar(foo);
    }
    return foo.cachedBarResult;
}

static Qux _worker_Bar(const Foo & foo)
{
    // real Bar work
}

我想让Bar有内部联系。可以这样做吗?

1 个答案:

答案 0 :(得分:6)

是的,在你说它是朋友之前,你只需要声明静态函数的原型。

class Foo;
static const Qux & Bar(const Foo & foo);

class Foo
{
    private:
        mutable Qux cachedBarResult;
    // ... more code here ...
    public:
        friend const Qux & Bar(const Foo &);
};


static const Qux & Bar(const Foo & foo)
{
    if (foo.cachedBarResult.isEmpty())
    {
        foo.cachedBarResult = _worker_Bar(foo);
    }
    return foo.cachedBarResult;
}