创建表示安全ORrable标志的类时出现问题

Trouble creating a class representing safely-ORrable flags

本文关键字:问题 表示 安全 ORrable 标志 创建      更新时间:2023-10-16

我正在尝试创建一个实现"安全标志"模式的小类集,该模式只允许将预定义的值进行OR运算。我想出了这样的办法:

class MyClass;
class CreateFlag
{
friend class MyClass;
private:
    int value;
    CreateFlag(int newValue)
    {
        value = newValue;
    }
public:
    CreateFlag operator | (const CreateFlag & right) const
    {
        int newValue = value | right.value;
        return CreateFlag(newValue);
    }
    CreateFlag(const CreateFlag && flag)
    {
            value = flag.value;
    }
    CreateFlag(const CreateFlag & flag)
    {
        value = flag.value;
    }
    static const CreateFlag Flag1;
    static const CreateFlag Flag2;
    static const CreateFlag Flag4;
};
const CreateFlag CreateFlag::Flag1 = CreateFlag(1);
const CreateFlag CreateFlag::Flag2 = CreateFlag(2);
const CreateFlag CreateFlag::Flag4 = CreateFlag(4);
class MyClass
{
public:
    static void DisplayFlag(CreateFlag flag)
    {
        printf("Flag value: %dn", flag.value);
    }
};
int main(int argc, char * argv)
{
    MyClass::DisplayFlag(CreateFlag::Flag1 | CreateFlag::Flag2);
    getchar();
}

问题是,CreateFlag有一个私有的ctor(这是故意的),因此无法指定CreateFlag的静态字段的值,并且上面的代码不会编译。

绕过此限制的一种方法是将静态字段更改为返回CreateFlag实例的静态方法,但这是一个肮脏的解决方案,因为您必须调用类似的方法:

MyClass::DisplayFlag(CreateFlag::Flag1() | CreateFlag::Flag2());

有直接的解决方案吗?如果它更改了任何内容,那么标志定义也可以移动到MyClass类中。

我也知道,C++11支持静态字段的就地初始化,但不幸的是,VC++10还不支持这种构造。。。

编辑我已经修改了代码,这样任何人都可以复制并使用它,它现在编译并按预期工作。

上面的代码没有编译,但我认为它没有编译的原因超出了您的预期。具体来说,编译错误在这一行:

MyClass::DisplayFlag(CreateFlag::Flag1 | CreateFlag::Flag2);

原因是DisplayFlag按值取其CreateFlag参数,并且您已将复制构造函数标记为private。

如果你试图确保人们不能对无效值进行OR运算,我认为你不需要复制构造函数是私有的。制作你知道有效的CreateFlag的副本不允许客户端做任何他们以前不能做的事情。如果你省略了复制构造函数的定义,只让C++的默认复制支持为你工作,你应该没问题。

您指出的导致错误的行似乎不会引起任何问题删除复制构造函数后,它编译得很好

希望这能有所帮助!