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

标签 c++ enums bitwise-operators member bitmask

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

特别是我的 CreateMenuDlg 函数

我在 google 上搜索了很多,找到了各种关于位掩码、位域等的论坛问题,每个人都发布了最少的示例代码
我一直在寻找使用#define 但这对我的类(class)不起作用,因为我需要从主对话框中调用它,如下所示:

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
{
     // ...
}

关于c++ - 位掩码作为具有默认参数的成员枚举,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27166613/

相关文章:

c++ - 多个 vtables,在打电话时以错误的方式结束

c++ - Visual Studio 中以字母 'x' 或 'xx' 开头的头文件是什么?

c - 像 "GLenum GlewInitResult = glewInit();"这样的声明(?)是做什么的?

C - 如何返回所有偶数位设置为 1、所有奇数位设置为 0 的字?

assembly - 如何在 mips 程序集中注册 "NOT"

java - 为什么这个加法代码(使用按位运算)在 java 中有效

C++ 读入函数内部的结构数组?

c++ - 从 C++ 到 Delphi 的类型转换

c++ - 在 C++ 中创建新类型时出错

scala - 自定义 Scala 枚举,搜索到的最优雅的版本