4

特定の 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内部リンケージを作りたい。それはできますか?

4

1 に答える 1

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;
}
于 2012-10-24T17:27:22.747 に答える