2011-11-04 101 views
1

爲什麼gcc無法編譯成功下面的代碼? 構造函數是否可以在類中定義?構造函數可以從類中定義嗎?

#include <string> 
using std::string; 

class Person{ 
public: 
    Person(const string &a, const string &b); 
private: 
    string name, address; 
}; 

Person::Person(const string &a, const string &b){ 
    name(a); 
    address(b); 
} 

謝謝!

回答

6

你的語法是錯誤的:

Person::Person(const string &a, const string &b) : name(a), address(b) {} 
13

,因爲無論name也不address是調用。您可能打算將它們放入成員初始化程序列表中。

Person::Person(const string &a, const string &b) 
    : name(a), address(b) 
{ 
} 
3

你剛纔寫錯了。它應該是:

Person::Person(const string &a, const string &b) : name(a), address(b) { } 

原則,並非常在實踐中,也可以並應該在類定義之外成員函數來解耦代碼庫和編譯縮短時間。

2

這被稱爲執行和聲明的分離。將您的實現分開保存在cccpp文件中實際上是一個好主意。

因此,在您的標題:

//Person.h 
#ifndef PERSON_H // <---- include header guards in your headers 
#define PERSON_H 

#include <string> 
//using std::string; <--- you should remove this line, you don't want to import namespaces 
//      in your header file, or else they are imported in all 
//      files including this header 

class Person{ 
public: 
    Person(const std::string &a, const std::string &b); 
private: 
    std::string name, address; // qualify your names in the header 
}; 

#endif 

和您的實現文件:

//Person.cpp 
#include "Person.h" 
using namespace std; // <---- if you wish, import the std namespace in your global namespace 
         //  in the implementation file 
Person::Person(const string &a, const string &b): 
    name(a),  // <---- correct syntax of initializer lists 
    address(b) 
{ 
} 
相關問題