2017-02-14 54 views
1

code將此枚舉傳遞給CTOR有什麼不對?

#include <iostream> 

enum EnvelopeMultiPointsType { 
    ENVELOPE_MULTI_POINTS_TYPE_NORMAL = 0, 
    ENVELOPE_MULTI_POINTS_TYPE_KICK_PITCH, 
    kNumEnvelopeMultiPointsTypes 
}; 

class EnvelopeMultiPoints 
{ 
public: 
    EnvelopeMultiPoints(EnvelopeMultiPointsType type) : mType(type) { 
     std::cout << mType << std::endl; 
    } 
    ~EnvelopeMultiPoints() { }; 

private: 
    EnvelopeMultiPointsType mType; 
}; 

class Test 
{ 
public: 
    Test() { }; 
    ~Test() { }; 

private: 
    EnvelopeMultiPoints mEnv(EnvelopeMultiPointsType::ENVELOPE_MULTI_POINTS_TYPE_NORMAL); 
}; 

int main() 
{ 
    Test test; 
} 

看來我不能初始化類與枚舉。不知道爲什麼。我在這裏錯過了什麼?

在線編譯器說沒有在'EnvelopeMultiPointsType'中命名'ENVELOPE_MULTI_POINTS_TYPE_NORMAL',但它在上面聲明。

+0

這是因爲你使用枚舉值作爲參數。這就像編寫'EnvelopeMultiPoints mEnv(0);'作爲函數聲明一樣。相反,使用'EnvelopeMultiPoints mEnv(EnvelopeMultiPointsType a_type);' –

回答

2

當初始化的成員變量內嵌像你想做的事,那麼你必須使用括號或等於初始化。

I.e.無論是

// Use braces 
EnvelopeMultiPoints mEnv{EnvelopeMultiPointsType::ENVELOPE_MULTI_POINTS_TYPE_NORMAL}; 

或者

// Use equal 
EnvelopeMultiPoints mEnv = EnvelopeMultiPointsType::ENVELOPE_MULTI_POINTS_TYPE_NORMAL; 

這是防止the most vexing parse模糊的方式。

讀取例如this member initialization reference瞭解更多信息。

5

此行

EnvelopeMultiPoints mEnv(EnvelopeMultiPointsType::ENVELOPE_MULTI_POINTS_TYPE_NORMAL); 

被解析爲一個函數mEnv返回EnvelopeMultiPoints並採取不存在EnvelopeMultiPointsType::ENVELOPE_MULTI_POINTS_TYPE_NORMAL型的1個變量作爲單一無名參數的聲明。

初始化您的變量是這樣,而不是:

EnvelopeMultiPoints mEnv = EnvelopeMultiPointsType::ENVELOPE_MULTI_POINTS_TYPE_NORMAL;