创建表示安全ORrable标志的类时出现问题
Trouble creating a class representing safely-ORrable flags
我正在尝试创建一个实现"安全标志"模式的小类集,该模式只允许将预定义的值进行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++的默认复制支持为你工作,你应该没问题。
您指出的导致错误的行似乎不会引起任何问题删除复制构造函数后,它编译得很好。
希望这能有所帮助!
相关文章:
- 警告处理为错误这里有什么问题
- 最小硬币更换问题(自上而下方法)
- 为"adjacent"变量赋值时出现问题
- 我的神经网络不起作用 [XOR 问题]
- 表示"accepting anything for this template argument" C++概念的通配符
- 在Ubuntu 16.04上安装Cilk时出现问题
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 编译包含字符串的代码时遇到问题
- Project Euler问题4的错误解决方案
- 问题:什么是QAbstractItemView::NoEditTriggers的反面
- 在编译C++代码(具有dlib和opencv)到WASM时面临问题
- 在进程中对同一管道进行读取和写入时C++管道出现问题
- 使用指针计算堆栈问题的大 O 表示法
- 字符串副本表示缓冲区太小,strcpy_s源问题
- 后缀表示法计算器 (RPN) 问题C++
- 创建表示安全ORrable标志的类时出现问题
- 时区问题:“$date-R”表示“+0300”,但“时区”表示“-7200”
- 列表或指针的问题,图的邻接表示
- C++指针、迭代器、图的邻接列表表示的问题
- 对以下用户定义类片段中的模板实例化问题表示怀疑