2012-03-31 26 views
1

我試圖創建一小組實現「安全標誌」模式的類,它只允許預定義的值一起進行或運算。我想出了這樣的事情:創建表示安全可編輯標誌的類時出現問題

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不支持此結構尚未...

編輯我已經修改了代碼,以便任何人都可以複製並使用,現在編譯並按預期工作。

回答

2

上面的代碼不能編譯,但我認爲它不是因爲你期望的原因而編譯的。具體來說,編譯錯誤是在這一行:

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

的原因是,通過DisplayFlag值取其CreateFlag說法,並且已經打上拷貝構造函數私有。

如果您試圖確保人們無法將無效值合併在一起,我認爲您不需要複製構造函數爲私有。製作您認爲有效的CreateFlag副本不允許客戶做任何他們以前無法做到的事情。如果你省略了拷貝構造函數的定義,並且讓C++的默認拷貝支持爲你工作,那麼你應該沒問題。

您指出的導致錯誤的行似乎不會導致任何問題。 It compiles just fine一旦你刪除了複製構造函數。

希望這會有所幫助!

+0

哦,可憐的我。我已經糾正了這個錯誤,但是在修改了整個PoC之後,我沒有注意到它確實起作用。這是否意味着,靜態字段初始化程序具有與類相同的作用域訪問權限,該字段正在被初始化? – Spook 2012-03-31 17:13:33

+0

@ Spook-我相信如此,因爲它在課堂上是邏輯上的一部分。 – templatetypedef 2012-03-31 17:14:54

+0

現在一切都很清楚。感謝幫助! – Spook 2012-03-31 17:43:50