2

このトピックに関連して:コピー アンド スワップ イディオムとは何ですか?

これは、1 つのクラスが最大で 1 つのリソースを処理する必要があることを示しています。リソース とはどういう意味ですか?

編集:たとえば、各モニターの情報を処理し、デスクトップ ピクセルの配列を含むクラスがあります。アレイとアレイのみがリソースと見なされますか? モニター情報を保持するモニターの配列とデスクトップ ピクセルの配列は、別のクラスを必要とする別のリソースでしょうか? 別のクラスですが、そういうことですか?

ここと Google を検索しましたが、3 つのルールまたはリソース ファイル (*.rc と MSDN) に関する詳細情報しか見つかりません。定義に関係するものは何もありません。

4

2 に答える 2

5

その質問は、一般的な C++ の概念に言及しています。この場合、「リソース」の一般的な概念も使用しています。オブジェクトは通常、外部ソースによって提供され、コード ブロックが使用します。現実の「資源」と同じです。

コピー アンド スワップの場合は、C++ クラスが表すものを参照しています。アイデアは単純です。C++ クラスの各インスタンスは、特定のリソースへのアクセスを提供します。たとえば、ディスク上のファイルを見てみましょう。リソースはファイルです。オペレーティング システムがそのファイルへのアクセスを提供します。C++ クラスは、オペレーティング システムの API 呼び出しをラップして、そのファイルの読み取りと書き込みを行います。

あなたがリンクした質問は、これらのクラスを C++ の初期化規則と混合する方法について尋ねています。これらのルールをどのように守るかは、外部ソースにアクセスできるものと、個人的に何をする必要があるかによって形作られます。

もちろん、プログラムは独自のリソースを持つこともできます。たとえば、ある種類の列挙型を別の種類の列挙型にマップするグローバル配列は、プログラム内のリソースになる可能性があります。したがって、「私のプログラムのリソースは何であるべきか」という質問に対する答えは、「プログラムをどのように作成したかによって異なります」です。


Windows プログラムには、ビットマップ、アイコン、ダイアログ ボックス コントロールのレイアウト、メニュー レイアウト、ローカライズされた文字列など、独自の「リソース」もあります。これらを出力バイナリに埋め込むことができるようにするために、Windows は独自のシステムを提供し、これらすべての「リソース」も呼び出します。.rc ファイルは、これらの Windows リソースをすべてリストする方法にすぎません。それを Windows プログラムに組み込みます。

GLib (GTK+ はその上に構築されています)、Qt、およびさまざまな Apple API には独自の類似システムがあり、それぞれの名前にも「リソース」が含まれています。

(これらすべての特定のリソースへのアクセスを提供する C++ クラスを作成することもできます。この場合、リソースリソースです。)

ただし、一般的な用語 (「リソース」) を特定のテクノロジ (Windows リソース) と混同しないように読むことが非常に重要です。特に、リソースのような抽象的な概念についてはそうです。プログラミングの旅を続けるときは、このことを念頭に置いてください。

于 2016-02-12T02:03:12.087 に答える
1

リソースとは、次のようなものです:raw pointers削除する必要があるもの (そのため、 、 のようなスマート ポインターがstd::unique_ptrあるstd::shared_ptr)、適切に閉じる必要があるファイル ( があるのはそのためstd::fstream)、std::thread(それ以外の場合は自分で管理する必要がある生のハンドルを管理するため)異なるオペレーティング システムで)。std::reference_wrapper参照を管理します...など。お気づきかもしれませんが、それらはすべて 1 つのリソースを管理しますが、それ以上ではありません。

unique_ptrアイデアは、1 つのポインターで 2 つのポインターを管理したくないということです。unique_ptr生ポインタごとに2 つのクラスを作成します。

編集した特定の質問について、一般的にやりたいことは次のとおりです。

すべてのモニターを管理するクラスを作成するMonitorsManager(それが彼の仕事です)

クラスを作成しますMonitorInfo(単一のモニター情報とピクセルを管理します

優れた設計があれば、物事が簡単になることに気付くでしょう。将来、これらのクラスを簡単に編集および更新できるようにする必要があるためです。すべてを混在させると、非常に難しくなります。

また、あなたの " " クラスを使用するためにクラス "MonitorsManager" をプロジェクトに含める必要がある場合は、失敗したことになるため、クラスにはMonitorInfo依存関係があってはなりません。全員が複数のモニターを持っているわけではなく、1 つしか持っていない人もいます。MonitorsManagerMonitorInfo

于 2016-02-12T02:00:37.953 に答える