我試圖創建一小組實現「安全標誌」模式的類,它只允許預定義的值一起進行或運算。我想出了這樣的事情:創建表示安全可編輯標誌的類時出現問題
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: %d\n", 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不支持此結構尚未...
編輯我已經修改了代碼,以便任何人都可以複製並使用,現在編譯並按預期工作。
哦,可憐的我。我已經糾正了這個錯誤,但是在修改了整個PoC之後,我沒有注意到它確實起作用。這是否意味着,靜態字段初始化程序具有與類相同的作用域訪問權限,該字段正在被初始化? – Spook 2012-03-31 17:13:33
@ Spook-我相信如此,因爲它在課堂上是邏輯上的一部分。 – templatetypedef 2012-03-31 17:14:54
現在一切都很清楚。感謝幫助! – Spook 2012-03-31 17:43:50