2014-12-19 75 views
0
class MyClass 
{ 
public: 
     ... 
private: 
    enum class BDTNodeType : unsigned char 
    { 
     NT_TERMINAL_ZERO, 
     NT_TERMINAL_ONE, 
     NT_TERMINAL_X, 
     NT_NOT_TERMINAL 
    }; 

    class BDTNode 
    { 
    public: 
     explicit BDTNode(BDTNodeType node_type = BDTNodeType::NT_NOT_TERMINAL); 
     BDTNode(const BDTNode &node); 
     ~BDTNode(); 

     BDTNodeType type; 
     BDTNode *thenPtr; //1 
     BDTNode *elsePtr; //0 
    }; 

    BDTNode *root_node; 

    //Constant nodes 
    static const BDTNode fv_nodes[3] = { 
     BDTNode(BDTNodeType::NT_TERMINAL_ZERO), 
     BDTNode(BDTNodeType::NT_TERMINAL_ONE), 
     BDTNode(BDTNodeType::NT_TERMINAL_X) 
    }; 
}; 

我想直接在類聲明中初始化靜態常量BDTNode fv_nodes數組,因爲C++ 11允許這樣做。但是我得到了「C2864:'MyClass :: fv_nodes':一個帶有類內初始值設定項的靜態數據成員必須具有非易失性const積分」。而且我不能在課堂外初始化它,因爲在這種情況下,「BDTNode」類將無法訪問。那麼我應該怎麼做?初始化私有成員靜態常量數組

回答

6

C++ 11允許這樣做

沒有,C++ 11不允許這樣。您可能會想到非靜態的成員初始化程序,它們可以作爲構造函數中初始化的替代方法。

對於靜態成員,規則沒有太大改變。類內聲明不是一個定義,除非它是一個非易失性的const整型或枚舉類型,並且不使用odr,否則它需要類之外的單個定義。如果您提供了一個初始化程序,那就繼續定義。

我不能在類之外初始化它,因爲在這種情況下,「BDTNode」類將無法訪問。

不,初始化程序位於類的範圍內,因此可以使用專用名稱。以下works for me

// in class 
static const BDTNode fv_nodes[3]; 

// in a source file 
const MyClass::BDTNode MyClass::fv_nodes[3] = { 
    BDTNode(BDTNodeType::NT_TERMINAL_ZERO), 
    BDTNode(BDTNodeType::NT_TERMINAL_ONE), 
    BDTNode(BDTNodeType::NT_TERMINAL_X) 
}; 
1

,但如果你願意,你可以用一個靜態函數做到這一點:

的確在變化在C++ 11,這是因爲線程安全沒有明確使用一個互斥體。

#include <array> 

class MyClass 
{ 
public: 
    // ... 
private: 
    enum class BDTNodeType : unsigned char 
    { 
     NT_TERMINAL_ZERO, 
     NT_TERMINAL_ONE, 
     NT_TERMINAL_X, 
     NT_NOT_TERMINAL 
    }; 

    class BDTNode 
    { 
    public: 
     explicit BDTNode(BDTNodeType node_type = BDTNodeType::NT_NOT_TERMINAL); 
     BDTNode(const BDTNode &node); 
     ~BDTNode(); 

     BDTNodeType type; 
     BDTNode *thenPtr; //1 
     BDTNode *elsePtr; //0 
    }; 

    BDTNode *root_node; 

    static const std::array<BDTNode, 3>& fv_nodes() { 
     static const std::array<BDTNode, 3> _fv_nodes { 
      BDTNode(BDTNodeType::NT_TERMINAL_ZERO), 
      BDTNode(BDTNodeType::NT_TERMINAL_ONE), 
      BDTNode(BDTNodeType::NT_TERMINAL_X) 
     }; 
     return _fv_nodes; 
    } 

    static const BDTNode& fv_node(size_t i) { 
     assert(i < 3); 
     return fv_nodes()[i]; 
    } 
};