2011-10-21 252 views
1

我有以下功能。我需要爲詳細級別設置一個通用值。 錯誤:Iso C++禁止隔離。我是否需要通過構造函數來完成此操作?設置類屬性的默認值

是, 我試過了,它的工作是這樣

arche() 
    { 
    verbosity_ = 1; 
    } 

但是我記得C++有默認成員值的特殊語法。這可能是我應該使用的。它是什麼?

class test 
    { 
    protected: 
     short verbosity_=1; // this does not work 
    public: 
     void setVerbosity(short v) 
     { 
     if((v==0 || v==1)) 
      { 
      verbosity_ = v; 
      } 
     else 
      { 
      cout << " Verbosity Level Invalid " << endl; 
      } 
     } 
     virtual void runTest() = 0; 
    }; 
+0

可能重複http://stackoverflow.com/questions/ 846673/default-init-value-for-struct-member-of-a-class) –

+0

不要編輯問題的答案。 –

回答

3

在C++ 98和2003中,你不能這樣做;你必須通過構造函數來完成。

在最新的標準C++ 11中,您可以使用您正在嘗試的語法。

+0

好的,它會包括提升?關閉主題... – user1001776

1

在C++ 98和C++ 03中你mayonly初始化static const這樣的成員。

struct T { 
    int x = 3; 
}; 

int main() { 
    T t; 
    std::cout << t.x; 
} 

// prog.cpp:4: error: ISO C++ forbids initialization of member ‘x’ 
// prog.cpp:4: error: making ‘x’ static 
// prog.cpp:4: error: ISO C++ forbids in-class initialization of non-const static member ‘x’ 


struct T { 
    static const int x = 3; 
}; 

int main() { 
    T t; 
    std::cout << t.x; 
} 

// Output: 3 

否則你must使用構造函數 - 初始化器:

struct T { 
    int x; 
    T() : x(3) {} 
}; 

int main() { 
    T t; 
    std::cout << t.x; 
} 

// Output: 3 

但在C++ 11你可以做就是內置類型:

4

你可以在c onstructor,但你並不需要一個任務,你可以使用初始化語法像這樣:

test::test() : verbosity_(1) 
{ 
} 
+0

這正是埃德加斯在幾分鐘之前所說的......我應該在發佈答案之前刷新頁面。 – filipe

2

在C++ 03則需要短部件初始化在構造函數中。

作爲(有限的)的解決方法,下面將針對整數類型工作:

template <class T, T value> 
struct defaulted 
{ 
    T val_; 
    defaulted(): val_(value) {} //by default initializes with the compile-time value 
    defaulted(T val): val_(val) {} 
    operator T() const { return val_; } 
}; 

class test 
    { 
    protected: 
     defaulted<short, 1> verbosity_; 
    public: 
     void setVerbosity(short v) 
     { 
     if((v==0 || v==1)) 
      { 
      verbosity_ = v; 
      } 
     else 
      { 
      cout << " Verbosity Level Invalid " << endl; 
      } 
     } 
     virtual void runTest() = 0; 
    }; 
([一類的結構成員缺省的init值]的