問題タブ [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 投票する
3 に答える
5391 参照

c++ - このキー指向のアクセス保護パターンの再利用性を高めることはできますか?

このキー指向のアクセス保護パターンの再利用性を高めることはできますか?

継続的な誤解を避けるために、このパターンは弁護士/依頼人のイディオムとは異なります。

  • Attorney-Clientよりも簡潔にすることができます(3番目のクラスを介したプロキシが含まれないため)
  • アクセス権の委任を許可できます
  • ...しかし、元のクラスではより煩わしいものです(メソッドごとに1つのダミーパラメーター)

(この質問で開発されたサイドディスカッションなので、この質問を開きます。)

0 投票する
6 に答える
8244 参照

c++ - boost::make_sharedを私のクラスの友達にする方法

保護されたコンストラクターを使用してクラスを作成したので、新しいインスタンスは、shared_ptrをクラスに返す静的なcreate()関数でのみ生成できます。効率的な割り当てを提供するために、create関数内でboost :: make_sharedを使用したいのですが、コンパイラーは、クラスコンストラクターがboost::make_shared内で保護されていると文句を言います。私はboost::make_sharedをクラスの友達にすることにしましたが、構文に戸惑っています。私は試した

しかし、コンパイラは私に構文エラーを与えました。助けてください。

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

c++ - フレンド機能とテンプレート

私の質問はこの質問に関連しています。

上記のコードがコンパイルされないのはなぜですか?

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

c++ - テンプレート クラスと c++ のフレンド キーワード (特定の例は、boost::multi_index を参照)

だからあなたはクラスの従業員を持っています

カプセル化用のプライベート データ メンバーがあります。しかし、今は boost::multi_index を使いたい....

だから私は BOOST_INDEX_CONST_MEM_FUN を使うことができました...

しかし、私が本当にやりたいことは、従業員クラスのプライベート データ メンバーへのアクセスを employee_set に許可することです。私はそれを行う方法を理解できません:-/

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

c++ - テンプレート化された << フレンドが、他のテンプレート化された共用体タイプと相互関係にある場合に機能しない

私の基本的なベクター ライブラリに取り組んでいる間、私はスウィズル ベースの印刷に優れた構文を使用しようとしてきました。この問題は、問題のベクトルとは異なる次元のスウィズルを印刷しようとすると発生します。GCC 4.0 では、元々、各ベクトルのすべての次元に対して友人の << オーバーロードされた関数 (コードを複製したにもかかわらず、本体を使用) がありました。これにより、非ネイティブな次元コードが実際に呼び出されなかった場合でも、コードが機能しました。 . これは GCC 4.2 では失敗しました。私は最近、コードの本体ではなく、関数宣言のみが必要であることに気付きました (愚かな私)。GCC 4.0 と 4.2 の両方で同じ警告が表示されるようになりました。

さらに、他の関数宣言に対する 5 つの同一の警告。

以下のコード例は、何が起こっているかを正確に示しており、問題を再現するために必要なすべてのコードが含まれています。

コードは動作し、正しい出力を生成しますが、私は可能な限り警告のないコードを好みます。私はコンパイラが私に与えたアドバイスに従いました(ここに要約され、この警告に対する回答としてフォーラムとStackOverflowで説明されています)、コンパイラに何が起こっているのかを伝えると思われる2つのことを追加しました。つまり、テンプレート化された共用体の事前定義の後に、関数定義を非フレンドとして追加しました。

そして、問題を引き起こす各フレンド関数に、<>VECTOR2 の場合のように、関数名の後に を追加しました。

ただし、これを行うと、次のようなエラーが発生します。

LINE 139: error: no match for 'operator<<' in 'std::cout << my2dVector.VECTOR2<float>::xxx'

どうしたの?これらのテンプレート化されたユニオンクラスのような構造がどのように相互に関連しているかに関連するものですか、それともユニオン自体によるものですか?

アップデート

関連する問題を再考し、Potatoswatter のさまざまな提案を聞いた後、最終的な解決策を見つけました。インターネット上のほぼすべての cout オーバーロードの例とは異なり、プライベート メンバー情報にアクセスする必要はありませんが、パブリック インターフェイスを使用して必要なことを行うことができます。そこで、本当のフレンド オーバーロード関数を呼び出すスウィズル パーツのインラインである非フレンド オーバーロード関数を作成します。これにより、テンプレート化されたフレンド関数に関するコンパイラの問題が回避されます。プロジェクトの最新バージョンに追加しました。警告なしで試した両方のバージョンの GCC で動作するようになりました。問題のコードは次のようになります。

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

c++ - C ++友人のクラスにアクセスする->メンバー->パブリックメソッド?

次のコードは C++ で有効ですか。フレンド クラス メンバーのパブリック メソッドにアクセスしますか? これは紛らわしいと思いますが、それを示す最善の方法はコードです。TestClassC::Method() が以下のコードで有効かどうか疑問に思っていましたか?

私は (g++) をコンパイルして動作しましたが、TestClassC::Method() で他のマシン/ディストリビューションでセグメンテーション エラーが発生する状況に遭遇しました。this->classA_Ptr->classB.Method(); かどうか疑問に思っています。C++ では合法です。

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

c++ - 1 つのクラス テンプレートの 2 つのインスタンス間の C++ フレンド比較

テンプレートの種類が異なる 2 つのインスタンス間の比較演算子を提供するクラス テンプレートを作成しようとしています。よくあることですが、このオペレーターは非会員の友人です。私が達成しようとしていることの簡単な例を以下に示します。

この例 (g++ 4.4.0) はコンパイルされません。代わりに、y_fromWrapper<Y>がプライベートであり、friend 関数にアクセスできないと不平を言います。その理由はわかります。しかし、どうすればこれを修正できますか? 逆関数に友情を追加する

Wrapper クラスのテンプレート本体に挿入すると、コンパイラにあいまいさが生じるだけです。Wrapper クラスの異なるインスタンスが互いのプライベート メンバーにアクセスできるようにしたくありません。この 1 つのオペレーターへのアクセスを制限したいのです。これは可能ですか?

私のラップトップは脱気の危険にさらされているので、どんなアイデアでも私とラップトップ (そしてそのウィンドウ) の両方に喜ばれるでしょう。

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

c++ - クラス メンバーで関数を呼び出す (C++)

Zh

Xh

MainClass.h

X.cpp

オブジェクトDoSomethingNasty()から関数を呼び出すにはどうすればよいですか?_z

0 投票する
10 に答える
62753 参照

c++ - C++ が継承された友情を許可しないのはなぜですか?

C++で友情が少なくともオプションで継承できないのはなぜですか? 推移性と再帰性が明らかな理由で禁止されていることは理解していますが (単純な FAQ の引用の回答を避けるためにこれを言っているだけです)、virtual friend class Foo;パズルの線に沿った何かが欠けていることに私は戸惑っています。この決定の背後にある歴史的背景を知っている人はいますか? 友情は本当に単なる限定的なハックであり、その後、いくつかのあいまいな立派な用途に発展しましたか?

明確にするために編集: A の子が B のいずれかに、または B とその子の両方にさらされる場所ではなく、次のシナリオについて話しています。オプションで、フレンド関数のオーバーライドなどへのアクセスを許可することも想像できます。

受け入れられた答え: Loki が述べているように、フレンドシップされた基本クラスで保護されたプロキシ関数を作成することにより、効果は多かれ少なかれシミュレートできるため、クラスまたは仮想メソッド階層にフレンドシップを付与する厳密な必要性はありません。ボイラープレート プロキシ (フレンドシップ ベースが事実上そうなります) の必要性は嫌いですが、これは、ほとんどの場合誤用される可能性が高い言語メカニズムよりも好ましいと見なされたと思います。これらのタイプの質問に対するより良い洞察を得るために、おそらくStroupstrupのThe Design and Evolution of C++を購入して読む時が来たと思います.

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

c++ - クラスの友達になる

クラスのプライベートコンストラクターに到達できるようにするために、クラスと友達になろうとしています。

some_file.h で

other_file.h 内

このコードをコンパイルすると、エラーが発生します: 'some_name::A::A(int)' is private.

私は今、非公開です。これが私が B と友達になった理由です。ここで何が間違っているのでしょうか? コンストラクターと友達になりませんか?名前空間の問題はありますか?

ありがとう