1

クラス B の関数でクラス A のプライベート メンバーにアクセスする必要があり、フレンド クラスを使用したいと考えています。ただし、C++ のようには使用できないようです。

「エラー C3816」クラス Class2 は以前に別の WinRT 修飾子で宣言または定義されていました

どうすれば解決できますか?
PS: クラス user に private member を知られたくないので、パブリック領域に get/set 関数を書くことはできません。

4

3 に答える 3

1

C++/CX ref クラスを宣言する理由を覚えておいてください。これは、別の言語で記述されたプログラムが C++ コードを使用できるようにするためです。そのような言語には、 friendキーワードの概念がなく、C++ 言語に非常に固有です。フレンド コントラクトを適用できるのは、C++ コンパイラだけです。実際、クライアント コードが C# で記述されている場合、CLR はアクセシビリティを強力に強化します。したがって、プロジェクトによって生成される .winmd ファイルのメタデータ形式は、友人の概念の表現をまったくサポートしていません。したがって、コンパイラもそうしません。

最初に、C++/CX を適切に使用していることを確認してください。クラスを他の言語からアクセスできるようにすることを実際に意図している場合にのみ、 ref クラスキーワードを使用してください。クラスが独自のコードでのみ使用される場合は、通常の C++ クラス ( refコンテキスト キーワードのないプレーンクラス) を使用します。相互運用クラスとして使用することが本当に意図されている場合は、メンバーを公開する以外に選択肢はありません。

于 2013-04-04T12:56:15.593 に答える
0

アクセス指定子は、偶発的なアクセスを防ぐための予防措置であるため、特定の選択された CX フレンド (xaml バインディング データコンテキスト コンテナーを保持するなど) を使用した std C++ および stl パフォーマンスは、単純なアプローチです。いずれにせよ、VC++ は WinRT ABI が OOP を介して混ざり合うことに関して人種差別主義者です。既知の代替手段の 1 つは、OO の代わりにジェネレーティブ メタ プログラミングに切り替えることです。これを行うには、テンプレート メンバー関数をコンシューマーとフレンドシップしたいクラスに保持し、これをコンシューマーのスコープで特殊化してから、コンシューマー内から特殊化されたバージョンを使用します。それは、マイクロソフトの家族の友情関係から隠されているようなものです。

于 2013-04-23T17:35:13.797 に答える
0

これを使用して解決できます

friend ref class Class2;

それ以外の

friend class Class2
于 2013-07-15T05:21:52.863 に答える