位掩码作为具有默认参数的成员枚举



我不知道如何为我的类实现位掩码参数。

特别是我的 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;  
};


为此,我收到来自位掩码枚举不是 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++我的项目上获得更多分数,而位字段是我们最近学到的东西。(尽管我们从未学会如何将它们实现为枚举,只是在字符变量上玩弄它们。

这不是

enum dlgFlags的OR运算符,而是DialogMenuoperator|=(有3个操作数,包括*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的成员。就个人而言,我更愿意将其与enum dlgFlags本身一起移出DialogMenu类:

enum dlgFlags
{
    HIDES = 2^0,
    // ...
};
dlgFlags operator|(dlgFlags first, dlgFlags second)
{
    return (dlgFlags)( (unsigned)first | (unsigned)second );
}
class DialogMenu : public CDialog
{
     // ...
}

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

最新更新