問題タブ [friend]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
2 に答える
6407 参照

c++ - クラスが名前空間の下にある場合、フレンド関数はプライベート関数にアクセスできません

名前空間内にクラスがあり、そのクラスにプライベート関数が含まれています。そして、グローバル機能があります。そのグローバル関数を、名前空間内にあるクラスのフレンドにしたい。しかし、私が友人として作ると、コンパイラは関数がグローバルではなく、その名前空間自体の中にあると考えます。そのため、グローバル関数でプライベート メンバー関数にアクセスしようとしても機能しませんが、その名前空間自体で同じ名前の関数を定義すると機能します。以下は、あなたが見ることができるコードです。

私も友達として友達を作ろうとしました void ::fun(); また、それは役に立ちません。

0 投票する
4 に答える
311 参照

c++ - C++の未使用のフレンドクラス

friendクラスが宣言されているがプライベートメンバーにアクセスしていないかどうかを(たとえばコンパイラの警告で)検出する方法はありますか?友情が役に立たないとき?

0 投票する
3 に答える
12237 参照

c++ - クラスの友達ですが、プライベートメンバーにアクセスできません

フレンド関数は、クラスのプライベート メンバーにアクセスできるはずですよね? それで、私はここで何を間違えましたか?.h ファイルに operator<< を含めました。このクラスと仲良くするつもりです。

0 投票する
1 に答える
161 参照

c++ - 友人の適切な使用?特定の型のオブジェクトを操作するために設計されたコンテナー クラス

FooManagerタイプ の複数のオブジェクトを管理するために作られたとしましょうFoo。は、現在の状態を評価するために のFooManager一部を確認する必要があります。Foo以前は、いくつかのアクセサーを使用してこれらのパーツを確認していましたが、実際にこれらを使用している唯一のクラスFooであることに気付きました。と友達にFooManagerなることにしました。これにより、ほとんどのクラスが非公開になりました。FooManagerFooFoo

これは友人の適切な使い方ですか?私の推論は、の内部FooManagerへの完全なアクセスを提供する一方でFoo、他のすべてへのアクセスを完全にブロックするため、カプセル化に役立つというものでした。

0 投票する
1 に答える
31234 参照

c++ - テンプレート化された構造体/クラスを友達として宣言するにはどうすればよいですか?

次のことをしたいのですが。

しかし、私のコンパイラ(VC8)はそれに窒息します:

私はすべての人のtemplate struct foo友人のfoo<T>すべての可能なインスタンス化をしたいと思いますT

これを機能させるにはどうすればよいですか?

編集:これ

コンパイルしているようですが、正しいですか?フレンドとテンプレートの構文は非常に不自然です。

0 投票する
1 に答える
1340 参照

c++ - テンプレートフレンドとネストされたクラス

次のコードを検討してください。

foo<T>::barのすべてのインスタンス化を、の友達にしたいと思いfoo<T>::bar<S>ますS。がネストされたテンプレートでない場合bar、上記の構文は問題なく機能します。しかし、私が例えばそうするとき

MSVC8(Visual C ++ 2005)はそれを好きではありません:

コンパイラを使用すると、同じエラーが発生します

代わりは。どうすれば私が望むことを達成できますか?

編集:私はダブルチェックしました(ここは朝です、そして私は本当に起きていません)、これはVC8のバグのようです:

0 投票する
4 に答える
611 参照

c++ - あるクラスで別のクラスのプライベート メンバーであるフレンドを宣言できないのはなぜですか?

次のコードがあるとします。

ScreenクラスがWindowMgr::relocateScreenメンバー関数をフレンドとして宣言できないのはなぜですか? 別のクラスのこのプライベート メンバー関数を使用するScreenのではなく、その関数が独自のプライベート メンバーにアクセスできるようにするだけです。

クラス内でのみ使用することを意図している場合、relocateScreen関数を公開することは悪い設計になる可能性があります。WindowMgr同様に、他の場合にのプライベート メンバーにアクセスすることが意図されていない場合Screen、 のフレンドを作成するWindowMgrことは悪い設計になる可能性があります。WindowMgr

ここでどこが間違っていますか?正しいアプローチは何ですか?私は自分を馬鹿にしていますか?

0 投票する
3 に答える
54015 参照

c++ - c++フレンド関数-istreamをオーバーロードする演算子>>

私の質問は、フレンド関数と、<<および>>のオーバーロードに関するものです。私の理解から、フレンド関数はプライベートメンバー変数に直接アクセスできる(そしてアクセスすべきである)と思いました。ただし、ここにある場合、コンパイラは、「get」関数を使用して各プライベート変数を取得したときにのみ、.cxxファイルを受け入れます。

これが私のヘッダーファイルです

これは、フレンド関数の実装を含む対応する.cxxファイルです。

したがって、この点で、上記のフレンド演算子は正しくコンパイルされました。ただし、私の演算子>>が1つのプライベート変数に直接アクセスできるのはなぜですか(>> bignum.digits [i])が、残りのプライベート変数は「getfunctions」で取得する必要があります

以下、この点でオーバーロード演算子を書き込もうとすると(フレンド関数がプライベート変数を適切に呼び出す必要があると私が考えた方法):

以下のエラーが発生します。

私が使用しているコンパイラはg++(バージョン3.3.1)です。どんな助けでもありがたいです、ありがとう。

改訂:

bignumオブジェクトがプライベート変数にアクセスできるようにコードを更新しました。フレンド演算子のオーバーロード<<に対して次のことを行い、正常にコンパイルされました。コメントありがとう、それは新人の間違いでした。

ただし、コンパイラはまだ>>演算子のエラーを生成しています

BigNum2.cxx:関数内std::istream& csci2270_hw1B::operator>>(std::istream&, csci2270_hw1B::BigNum&)': BigNum2.cxx:208: error: syntax error before)'トークン

>>は数値を読み込むことになっており、プライベートメンバー変数'used'は配列の長さを記録することになっています。コンパイラがなぜ受け入れるのか、私はまだ少し混乱しています

とは対照的に:

何かご意見は?ありがとう。

0 投票する
3 に答える
1844 参照

c++ - 派生クラスは基本クラスのフレンド関数を使用できますか?

私がいくつかのクラスベーシスを持っていて、それから派生した場合、内部ベースには友達機能があります

派生クラスの内部にはそのような関数がないので、私の質問はメインの内部にあるかどうかです

なぜそれが機能するのですか?事前に!=のおかげでキャストするためのコンストラクターがありません。if(派生!= basic)を記述した場合、それは機能しますか?

0 投票する
4 に答える
3402 参照

c++ - このキー指向のアクセス保護パターンの名前は?

どうやらこのキー指向のアクセス保護パターン:

... はまだ名前が知られていないので、舌を折らずに参照できるように、適切な名前を見つけたいと思います。提案?

そのはず:

  • 簡潔
  • アクセス保護の意図を伝える
  • 理想的には、プロキシが不要であることを意味します (?)