2015-07-22 69 views
1

我試圖表示卡提供商爲enum。基本上,信用卡(基於BIN號碼)可以是Visa或Mastercard,子類型可以是Credit或Debit(簡單示例,但我想處理所有情況(Maestro,Visa Electron,UATP ...)結合信用卡網絡的位掩碼枚舉

它似乎工作,但看到最後的情況下這是可以做到CardProvider Visa | CardProvider MasterCard這是不正確的,我們知道。

我有辦法防止這種情況?另外,它是當前enum結構是否正確?

enum CardProvider 
{ 
    CardProviderNone    = 0, 
    CardProviderMasterCard  = 1 << 0, 
    CardProviderMasterCardDebit = 1 << 1, 
    CardProviderMasterCardCredit = 1 << 2, 
    CardProviderVisa    = 2 << 0, 
    CardProviderVisaDebit  = 2 << 1, 
    CardProviderVisaCredit  = 2 << 2 
}; 

CardProvider cardType1 = CardProviderMasterCard; 
CardProvider cardType2 = CardProviderMasterCard | CardProviderMasterCardCredit; 
CardProvider cardType3 = CardProviderMasterCard | CardProviderMasterCardDebit; 
CardProvider cardType4 = CardProviderVisa | CardProviderVisaDebit; 

// possible to prevent? 
CardProvider cardType5 = CardProvider Visa | CardProvider MasterCard; 

// works as expected: 
assert(cardType1 & CardProviderMasterCard); 
assert(cardType2 & CardProviderMasterCardCredit); 
assert(cardType2 & CardProviderMasterCard); 
assert(cardType3 & CardProviderMasterCard); 
assert(!(cardType4 & CardProviderMasterCard)); 
assert(cardType4 & CardProviderVisa); 

// works but shouldn't be allowed 
assert(cardType5 & CardProviderVisa); 
+1

「我有辦法防止這種」 - 肯定的:不使用它,或趕在軟件。如果你問語言限制:不。 – Olaf

回答

0

你的卡類型是重疊(2<<0 == 1<<1)你只需要調整它們,所以它們不是。有很多不同的方式,但這是你看起來像你試圖做的。

typedef enum CardProvider { 
    CardTypeNone     = 0, 
    CardTypeCredit    = 1<<0, 
    CardTypeDebit    = 1<<1, 
    /* you may want to add padding here for extra card types */ 

    CardProviderMasterCard  = 1<<2, 
    CardProviderMasterCardDebit = CardTypeDebit | CardProviderMasterCard, 
    CardProviderMasterCardCredit = CardTypeCredit | CardProviderMasterCard, 

    CardProviderVisa    = 1<<3, 
    CardProviderVisaDebit  = CardTypeDebit | CardProviderVisa, 
    CardProviderVisaCredit  = CardTypeCredit | CardProviderVisa, 
    //future providers here 
}; 

int card_transaction(CardProvider, float amount, struct card_data); 

如果要對濫用編譯器錯誤,請參閱https://stackoverflow.com/a/14822654/1162141

1

您可能需要爲提供程序和類型使用單獨的枚舉,並使用連續的數字而不是位掩碼:

enum CardProvider 
{ 
    CardProviderNone    = 0, 
    CardProviderMasterCard  = 1, 
    CardProviderVisa    = 2 
}; 

enum CardType 
{ 
    CardTypeNone    = 0, 
    CardTypeDebit    = 1, 
    CardTypeCredit   = 2 
};