2017-01-15 98 views
3

我具有其中構造接收的整數的一類:傳遞常數C++構造

class One 
{ 
public: 
    One(int i) 
    { 
     foo(i); 
    } 

    void foo(int i) 
    { 
     // Do something with i 
    } 
}; 

上述編譯罰款。

我有第二類有一個類型的成員。編譯此導致錯誤,我通過INT(錯誤是「預期類型說明符」):

class Two 
{ 
public: 
    One x(1); 
}; 

我可以,但是,初始化部件,如果它是一個指針:

class Three 
{ 
public: 
    One *x = new One(1); 
}; 

我可以在不使用指針的情況下初始化該類嗎?

謝謝!

+0

也許你也可以試試'One x = 1' – ForceBru

回答

4

隨着:

class Two 
{ 
public: 
    One x(1); 
}; 

以及基於語言的規則,所述編譯器試圖解析x作爲成員函數返回One類型的對象,但是,而不是看到有效參數聲明這需要至少一個0或更多的列表類型說明符 s,它看到一個非類型

class Three 
{ 
public: 
    One *x = new One(1); 
}; 

我可以初始化,而無需使用指針類?

是,使用均勻撐初始化語法value-initialization

class Three 
{ 
public: 
    One x{1}; 
}; 

或者copy-initialization

class Three 
{ 
public: 
    One x = 1; //Uses converting constructor, 
    //see http://en.cppreference.com/w/cpp/language/converting_constructor 

    //or 
    One x = One(your, multiple, arguments, here); 
}; 

或者member-initializer-lists在構造函數:

class Three 
{ 
public: 
    Three(...) : x(1) { ... } 
    One x; 
    ... 
}; 
+0

不錯!我不知道大括號(和「=」將無法正常工作,因爲我實際上有多個參數傳遞給構造函數)。 –

+1

@SteveA也在[成員初始化程序列表](http://en.cppreference.com/w/cpp/language/initializer_list)上進行了閱讀。 – user4581301

4
One x(1); 

被解析爲一個函數聲明,這就是爲什麼它期望一個括號中的類型。您可以使用

One x = 1; 

One x{1}; 

代替。