我一直试图将这部分C ++代码转换为JAVA。方法调用PrintItem()
将DWORD
作为第二个参数,但在此特定示例中,它允许同时使用enum
中的两个元素?
我在following answer引用Ashish试图得到一些澄清,但它没有多大帮助。
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
};
传入两个枚举元素的方法调用?这是我不明白的。
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
是某种集合,不是吗?那么,你怎么做到这一点,只是得到正确的元素:if ( options & PRINT_PRECOMMENTS )
..
答案 0 :(得分:2)
这只是一个按位OR
,它允许将多个枚举值组合到内部的整数中(因此在函数调用中仍然只是一个参数)。这种枚举也称为旗帜。它们通常以具有仅代表一位的值的成员为特征:a = 1,b = 2,c = 4,d = 8,e = 16,......因此它们可以组合;当转换为int时,a | b
为3。
在函数体内部,然后使用按位&
运算符单独查询各个标志。
其他参考:How to use enums as flags in C++?
顺便说一句。这个概念在Java中看起来非常相似:Implementing a bitfield using java enums