0

私は C++/CLI を初めて使用し、マネージ型データ メンバーに関する "ベスト プラクティス" とは何か疑問に思っています。ハンドルとして宣言:

public ref class A {
public:
    A() : myList(gcnew List<int>()) {}
private:
    List<int>^ myList;
};

または値として:

public ref class B {
private:
    List<int> myList;
};

これに関する決定的なアドバイスを見つけることができないようです。

4

3 に答える 3

1

マネージ C++ コードを作成する場合、私は他のマネージ言語で使用されている規則に従うことに賛成です。usingしたがって、クラス レベルのデータ メンバーのハンドルを使用し、C# でステートメントを使用する場合にのみ値 (スタック セマンティクス) を使用します。

クラス メンバーが値の場合、オブジェクトを完全に置き換えるということは、オブジェクトにコピー コンストラクターを定義する必要があることを意味しますが、多くの .NET クラスではそうしません。また、オブジェクトを別のメソッドに渡したい場合は、演算子を使用して から に変換する必要があり%ます。( と入力するのは大したことではありませんが、忘れがちです。コンパイラ エラーは、 に変換できないと言っているだけです。)List<int>List<int>^%List<int>List<int>^

//Example of the `%` operator
void CSharpMethodThatDoesSomethingWithAList(List<int>^ list) { }

List<int> valueList;
CSharpMethodThatDoesSomethingWithAList(%valueList);

List<int>^ handleList = gcnew List<int>();
CSharpMethodThatDoesSomethingWithAList(handleList);
于 2012-07-02T23:31:44.007 に答える
1

それはすべて寿命に依存します。所有クラスとまったく同じ長さのプライベート メンバーがある場合は、2 番目の形式が適しています。

于 2012-07-02T15:06:19.173 に答える
1

個人的には、2 番目の形式を使用します。私がこれを言うのは、他のチームの人々によって書かれたフレームワークを使用していて、彼らがこのフォームを使用しているからです。

これは、よりクリーンで、使用するスペースが少なく、著者ではない人が読みやすいためだと思います。プロジェクトに関する最小限の知識しかない人でも読めるようにしながら、最も簡潔なコードが最善であることを心に留めておくようにしています。

また、後者の例では、ヘッダー ファイル、メソッド、クラス、またはデータ ファイルなどの読みやすさに関して、問題は発生していません。

私はこの問題の専門家とはかけ離れていますが、それが私の好みです。私にはもっと理にかなっています。

class AlgoCompSelector : public TSelector {
   public :
   AlgoCompSelector( TTree *tree = 0 );
   virtual ~AlgoCompSelector(){ /* */ };
   virtual void    Init(TTree *tree);
   virtual void    SlaveBegin(TTree *tree);
   virtual Bool_t  Process(Long64_t entry);
   virtual void    Terminate();
   virtual Int_t   Version() const { return 1; }

   void setAlgo( Int_t idx, const Char_t *name, TTree* part2, TTree* part3 );
   void setPTthres( Float_t val );
   void setEthres( Float_t val );                                                                                                                   

   private:
   std::string mAlgoName[2];                  // use this for the axis labels and/or          legend labels.                                         
   TTree *mPart1;
   TTree *mPart2[2], *mPart3[2];     // pointers to TTrees of the various parts                                                              
   TBranch *mPhotonBranch[2];                 // Used branches                                                                               
   TClonesArray *mPhotonArray[2];             // To point to the array in the tree 

例えば

于 2012-07-02T15:04:04.217 に答える