38561
お世話になります。

テストの際にどうしてもprivateメンバを触りたい場面があり、  
フレンドクラスで対応を行おうとしたのですが、以下のような  
実装でprivateメンバにアクセスできません。

```

        namespace testSpace
        {
            class testClass: public ::testing::Test
            {
            public:
                foo obj;
                int getNum(){ obj.testNum; }
            };
        }
    
    　　class foo
        {
                friend class testClass;
            private:
                int testNum;
        };
    
```

テストコード側に名前空間があり、テスト対象に名前空間がない場合に  
フレンドクラスを使ってprivateメンバにアクセスしたいときは  
どうすれば良いのでしょうか。

gtestを使っており、どうしてもテスト側(testClass)には名前空間を付けたいという  
状況で、テスト対象のコード（foo）はテスト側の名前空間に含めたくないです。

逆のパターン（テストコード側に名前空間がなく、テスト対象に名前空間がある）  
については既に解決策を見つけたのですが、今回のような場合をどのように  
対処すれば良いか解決策が見つからなかったため、こちらで質問させていただきました。  
よろしくお願い致します。
CC BY-SA 3.0
2017-10-10T06:44:26.683
38560
2017-10-10T07:36:56.657
2017-10-10T07:35:23.187
4236
24103
question
c++
フレンドクラスを使うときの名前空間について
C++言語では宣言と定義を分離することができます。

```

    namespace testSpace {
        class testClass;
    }
    
```

このように`testSpace::testClass`クラスが（内容を定義することなく）存在することだけを宣言できます。事前に宣言されていれば、

```

    class foo {
        friend class testSpace::testClass;
    private:
        int testNum;
    };
    
```

このように当該クラスをフレンド指定できます。

名前空間についてはどこであっても関係なく、名前空間無しの`testClass`であれば`friend class
::testClass`と明示するだけのことです。
CC BY-SA 3.0
2017-10-10T07:34:50.193
38561
2017-10-10T07:34:50.193
4236
38560
answer
どういうことがなさりたいのか今一理解できていませんが、  
先行して宣言だけすれば良いのではないかと思うのですが、どうなんでしょう。  
(ためしてません)

```

    namespace testSpace
    {
        class testClass; // 宣言のみ
    }
    
    using namespace testSpace;// これも必要
    
    class foo
    {
        friend class testClass;
        private:
            int testNum;
    };
    
    // 
    namespace testSpace//実体はこっち
    {
    class testClass
    //  : public ::testing::Test
    {
    public:
        foo obj;
        int getNum(){
            int     a = obj.testNum;
            return a;
        }
    };
    }
    
```
CC BY-SA 3.0
2017-10-10T07:36:56.657
38562
2017-10-10T07:36:56.657
3793
38560
answer