2012-04-14 60 views
0

幫助! 我是新來的C++ ... 我該如何解決這個頭文件?C++錯誤:預計有一個'{'

#pragma once 
class MyCls2 
{ 
private: 
    int _i, _j; 
public: 
    MyCls2(int i, int j) : _i(i), 
          _j(j) 
    MyCls2(); // error: expected a '{' 
    ~MyCls2(void); 
}; 

這是在MS VC 2010錯誤:

error: expected a '{'


感謝您的幫助,我得到了我現在想:

.H:

#pragma once 
class MyCls2 
{ 
private: 
    int _i, _j; 
public: 
    MyCls2(int i, int j) ; 
    MyCls2(); 
    ~MyCls2(void); 
}; 

.cpp:

#include "StdAfx.h" 
#include "MyCls2.h" 


MyCls2::MyCls2() 
{ 
} 

MyCls2::MyCls2(int i, int j) : _i(i), 
    _j(j) 
{ 
} 
MyCls2::~MyCls2(void) 
{ 
} 

回答

5

您正在使用初始值設定項列表提供構造函數定義。所以,它需要一個{}像任何其他(成員)函數。

MyCls2(int i, int j) : _i(i), 
         _j(j) {} // Missing the opening and closing braces 
2

您在構造函數MyCls2的定義中缺少函數體,它帶有兩個整數。

MyCls2(int i, int j) : _i(i), 
         _j(j) {} 

將初始化程序列表看作是構造函數本身(它的定義,不是它的聲明)的一部分。你不能在某處定義函數的一部分,而在其他地方定義另一部分。

如果你想在頭文件中使用初始化器列表,你還需要頭文件中剩下的定義(構造函數體),如上所述。
如果您不想在頭文件中定義,請不要將初始化程序列表放入頭文件中,將其放入實現文件中。

//header 
    MyCls2(int i, int j); 
// implementation 

MyCls2::MyCls2(int i, int j) : _i(i), _j(j) 
{ 
    // constructor body 
} 
+0

驚人的快...謝謝... 但它僅僅是頭文件,所以我認爲它不應該有一個函數體? – 2012-04-14 15:09:24

+3

不,頭文件可以有內聯函數體,而你的語法是隱式內聯的構造函數。 – 2012-04-14 15:12:04

+2

@im_chc:如果你不想在頭文件中定義構造函數,你只需要輸入'MyCls2(int i,int j);'。將啓動列表與構造函數的主體一起放入實現文件中(即使它是空的)。但是,在頭文件中使用構造函數體是沒有問題的,特別是如果它非常短。 – Mat 2012-04-14 15:14:13

1

MyCls2(int i, int j) : _i(i), _j(j) { } 

構造函數需要一個身體更換

MyCls2(int i, int j) : _i(i), 
         _j(j) 

,即使它是空的。

1

括號爲構造:

MyCls2(int i, int j) : _i(i), 
          _j(j) {}