2016-10-05 11 views
0

私はこの部分をJAVAに変換するC++コードを理解しようとしています。メソッド呼び出しPrintItem()は、DWORDを2番目のパラメータとして取り込みますが、この特定の例では、enumの2つの要素を同時に使用できますか?C++複数のenum要素がパラメータとして渡されていますか?

私はfollowing answerAshishで紹介していましたが、何か説明がありましたが、あまり役に立ちませんでした。

enum 
    { 
     PRINT_ENTRY   = 0x0001, 
     PRINT_PREPEND  = 0x0002, 
     PRINT_APPEND  = 0x0004, 
     PRINT_PRECOMMENTS = 0x0008, 
     PRINT_POSTCOMMENTS = 0x0010, 
     PRINT_SPECIAL  = 0x0010, 
     PRINT_DEFAULT  = PRINT_ENTRY | PRINT_PREPEND | PRINT_APPEND | PRINT_PRECOMMENTS | PRINT_POSTCOMMENTS | PRINT_SPECIAL 
    }; 

2つの列挙型要素が渡されているメソッド呼び出しはありますか?これは私が理解していないものです。

bResult = PrintItem(pMergeItem, PRINT_PREPEND | PRINT_ENTRY);

メソッドの宣言

bool PrintItem(CItem* pItem, DWORD options = PRINT_DEFAULT);

と定義は、少しダウントリミング:

// Prints an individual item to the invoice (based on appropriate template settings) 
bool CPrintRptInvoice::PrintItem(CItem* pItem, DWORD options) 
{ 
    bool bResult = true; 
    CString strKey = GetItemKey(pItem); 

    DWORD getOpts = CPrintTemplate::GE_NONE; 
    if (options & PRINT_ENTRY) 
     getOpts |= CPrintTemplate::GE_ENTRY; 
    if (options & PRINT_PREPEND) 
     getOpts |= CPrintTemplate::GE_PREPEND; 
    if (options & PRINT_APPEND) 
     getOpts |= CPrintTemplate::GE_APPEND; 

    CString strEntry = m_pTemplate->GetEntry(strKey, getOpts); 

    // print any prefix first 
    if (options & PRINT_PRECOMMENTS) 
     PrintComment(pItem->GetInvoicePrefix()); 

    // print main entry 
    if (strEntry.IsEmpty()) 
    { 
     if ((options & PRINT_ENTRY) && !m_pTemplate->EntryExists(strKey)) 
     { 
      //Code to print Entries, not touching options anymore. 
     } 
    } 

    // print any special cases 
    if (bResult && (options & PRINT_SPECIAL)) 
    { 
     //Code to print special cases, not touching options anymore... 
    } 

    // print any suffix last 
    if (options & PRINT_POSTCOMMENTS) 
     PrintComment(pItem->GetInvoiceSuffix()); 

    return bResult; 
} 

私の質問をされる - それはどのように列挙型の複数のパラメータを扱っていますか?私はそれがそのメソッド定義のそれを処理するのを見ません!私が整えたものは、optionsに全く触れていません。

私はoptionsを何らかのコレクションとして参照しているので、私は混乱していると思いますか?だから、これを行うことができ、正しい要素を得るにはどうすればいいですか:

答えて

2

これはちょうどビット単位でORです。これは、複数の列挙型の値を整数に組み合わせることを可能にします。それでも関数呼び出しの引数は1つだけです)。このような列挙型はフラグセットとも呼ばれます。それらは通常a = 1、b = 2、c = 4、d = 8、e = 16などの値を持つメンバーによって特徴付けられます。 a | bは、int型にキャストされたときに3です。 関数本体の中で、個々のフラグは、ビット単位の&演算子を使用して個別に照会されます。

追加参照:ところでHow to use enums as flags in C++?

。このコンセプトは、Javaで非常によく似ているようです。Implementing a bitfield using java enums

+0

ありがとう、あなたはそれをうまく壊しました。私はそれが何であったかわからなかったので、これについての情報を見つけるのは苦労したと思います。Javaでうまく動作します! – Dayan

関連する問題