使用默认参数将位掩码作为成员枚举

时间:2014-11-27 08:59:52

标签: c++ enums bitwise-operators member bitmask

我无法弄清楚如何为我的班级实现一个bitmask参数。

特别是我的 CreateMenuDlg 功能

我搜索了谷歌相当多,找到各种关于位掩码,位域等问题的论坛问题,每个人发布最少的示例代码
我一直在找人使用 #define 但这对我的班级不起作用,因为我需要从主对话框中调用它,如下所示:

DialogMenu *p_dlgMenu = new DialogMenu( this, &p_dlgMenu, this );
p_dlgMenu->CreateMenuDlg( ( DialogMenu::CLOSES | DialogMenu::WINDOW_HANDLER ), DialogMenu::DLG_CHECKOUT );

这是我的代码:

class DialogMenu : public CDialog
{
    DECLARE_DYNAMIC(DialogMenu)

public:
    enum dlgFlags
    {
        HIDES = 2^0,
        CLOSES = (2^0)+1,
        WINDOW_HANDLER = 2^1,
        MSG_HANDLER = (2^1)+1,
        DLG_SHOPPING_MENU = 2^2,
        DLG_DYNAMIC_MENU = (2^2)+1,
    };

    dlgFlags operator|=( dlgFlags first, flgFlags second)
    {
        return (dlgFlags)( (unsigned)first | (unsigned)second );
    }

    enum dlgType { DLG_CHECKOUT, DLG_INVENTORY_EDIT, DLG_SHIPPING_RECEIVING };

    DialogMenu( CDialog * const, DialogMenu ** const, CWnd* pParent = NULL );
    void PostNcDestroy();
    virtual ~DialogMenu();

    void CreateMenuDlg( dlgFlags paramFlags = ( CLOSES | MSG_HANDLER | DLG_DYNAMIC_MENU ), dlgType paramType = DLG_CHECKOUT );

protected:
    virtual void DoDataExchange(CDataExchange * pDX);

    CDialog * m_parent;
    DialogMenu ** m_self;  
};


我收到的错误来自我的bitmask枚举不是int。

dialogmenu.h(21): error C2440: 'default argument' : cannot convert from 'int' to 'DialogMenu::dlgFlags'
Conversion to enumeration type requires an explicit cast (static_cast, C-style cast or function-style cast)


但我的OR运算符重载应该照顾该演员!

如果我必须完全抛弃比特标志,但是我正试图抓住它们,并且每个C ++主题覆盖我的项目得到更多分数,而bitfields是我们学到的最新东西。 (虽然我们从未学过如何将它们作为枚举实现,但只在字符变量上使用它们。)

2 个答案:

答案 0 :(得分:1)

这不是enum dlgFlags的OR运算符,而是operator|=的{​​{1}}(包含DialogMenu的3个操作数,因此无法编译):< / p>

*this

将其更改为

dlgFlags operator|=( dlgFlags first, flgFlags second)
{
    return (dlgFlags)( (unsigned)first | (unsigned)second );
}
需要

friend dlgFlags operator|(dlgFlags first, dlgFlags second) { return (dlgFlags)( (unsigned)first | (unsigned)second ); } 关键字才能使其不是friend的成员。就个人而言,我更愿意将其与DialogMenu类一起移出DialogMenu类:

enum dlgFlags

答案 1 :(得分:0)

对枚举声明本身中的每个值使用显式强制转换。