2017-02-02 13 views
3

プライベートフィールドのテストを有効にするために、私はテストクラスのクラスに友達として名前をつけました。私はクラスの名前が存在のために確認されていないことに気づいた。それは意図によるのか?「友人のクラス」が存在することが確認されないのはなぜですか?

+3

*「私はテストクラスをプライベートフィールドのテストを可能にするためにテストするクラスの友人としてテストクラスに名前を付けることに使用しました」* - それはひどい考えです。テストによってカプセル化が中断されてはなりません。 –

+3

宣言*作成*名前。彼らは名前の存在をチェックしません。 –

+0

あなたはあなたが持っているものの例と、それがうまくいかないと思うものの例を見せてもらえますか? – NathanOliver

答えて

2

フレンドクラス宣言使用しています:
はどのようにほとんどない適切な友人パターンをリファクタリングするためには、私はあなたが私のQ &にポストを読むことをお勧めします非修飾ののクラスの名前は実際にはの宣言とそのクラスの精巧な型指定子です。 は、そのクラスを囲む名前空間のメンバとしてを導入しています。それは

class C 
{ 
    friend class X; // OK, introduces '::X' 
}; 

事前に宣言するためにそれを必要としない。しかし、あなたが友人のクラス宣言に修飾名を使用している場合、それは通常の修飾名の検索の対象となります。そして、それはあなたのクラス名が「存在の検証」する場合は、

class X {}; 

class C 
{ 
    friend ::X; // OK, refers to '::X' 
    friend ::Y; // Error, no '::Y' in sight 
}; 

だから、以前に宣言された名前を参照してくださいfriend宣言に修飾名を使用する必要があります。

1

意図していますか?

だと思います。それは前方宣言に非常に似ています。

通常、friendクラスには、friendedクラスの完全な宣言が必要ですが、その逆もありません。 @bogdan's commentに述べたように、あなたが

class MyClass { 
    friend FriendClass; 
}; 

を使用することができます入力する存在(宣言)をチェック強制的に


。サイドノートとして


How can I remove refactor a «friend» dependency declaration properly?

+3

'friend class X;'の代わりに 'friend X;'と言うことができます。そしてそれは前の宣言を必要とします。多分これがOPを助けるでしょう。 – bogdan

+0

@bogdan興味深い。私はその文法の微妙さを知らなかった。 –

+0

私が標準の権利(** [dcl.type.elab] **)を読んでいるのは、宣言作業が 'class'によって行われ、' friend'が単なる修飾語であるからです。私の頭の中で働いている範囲についての** [class.friend] ** note 11のちょっと後のカップルの警告があります。 – user4581301

0

友達クラスが存在する必要がある場合を想像してください。コードをどのように構造化しますか?テストのために、あなたのコードでその友人宣言があります。出荷バージョンをビルドするときは、テストコードを出荷しないため、フレンド宣言を削除してすべてを再構築する必要があります。これで、テストしたコードとは異なるコードが出荷されます。

+0

bogdanとAnTからの返信を参照してください。それ以外の場合は、私は友人に固執していません。開発段階では、デバッグ/リリースの解決策もあります。アサルトのように。 – katang

関連する問題