2016-06-26 43 views
1

我是C++初學者。我已經學會了如何定義派生類的構造函數的類成員:如何定義派生類的非成員構造函數(在類頭文件中)

class A{ 
    ... 
    public: 
    A(params){} 
}; 

class B :public A{ 
    ... 
    public: 
    B(param1OfA, param2OfA, params) :A(param1OfA, param2OfA){} 
}; 

現在,我認爲同樣的原則將派生類的構造函數的非成員定義以及工作:

class A{ 
    ... 
    public: 
    A(params); 
} 

A::A(params){}; 

class B :public A{ 
    ... 
    public: 
    B(param1OfA, param2OfA, params) :A(param1OfA, param2OfA); 
}; 

B::B(param1OfA, param2OfA, params) :A(param1OfA, param2OfA){} 

而是,我得到這個錯誤在Visual Studio:

1> Source.cpp 
1>d:\webdev\c++\godina ii - parcijala-i\aa-vjezba-polimorfizam\source.cpp(63): error C2969: syntax error : ';' : expected member function definition to end with '}' 
1>d:\webdev\c++\godina ii - parcijala-i\aa-vjezba-polimorfizam\source.cpp(67): error C2144: syntax error : 'std::string' should be preceded by ')' 
1>d:\webdev\c++\godina ii - parcijala-i\aa-vjezba-polimorfizam\source.cpp(67): error C2630: ';' found in what should be a comma-separated list 
1>d:\webdev\c++\godina ii - parcijala-i\aa-vjezba-polimorfizam\source.cpp(67): error C2612: trailing 'type' illegal in base/member initializer list 
1>d:\webdev\c++\godina ii - parcijala-i\aa-vjezba-polimorfizam\source.cpp(84): fatal error C1004: unexpected end-of-file found 
+0

你爲什麼定義構造函數兩次? –

+0

@πάνταῥεῖ如果您在'public'部分中引用構造函數聲明後的第二個示例(非成員)和花括號的用法,那些複製第一個示例的拼寫錯誤。我已經刪除了這些。 – developer10

回答

1

你接近。要將構造函數主體定義(或任何類方法定義)移到類聲明之外,需要從類聲明中移除主體定義。你爲A做了這個,你需要爲B做。

此外,您正在錯過關於類聲明的關閉;

class A 
{ 
    ... 
public: 
    A(params); 
}; 

A::A(params) 
{ 
} 

class B : public A 
{ 
    ... 
public: 
    B(param1OfA, param2OfA, params); 
}; 

B::B(param1OfA, param2OfA, params) 
    : A(param1OfA, param2OfA) 
{ 
} 
+0

請在問題的下面看到我的評論。我確實犯了一個錯字,即。在複製第一個例子的代碼時,忘記去掉大括號。所以,在發佈這個問題之前我真正擁有的東西幾乎就是你寫的(你的代碼的這一行是否正確?B(param1OfA,param2OfA,params);'< - 頭中沒有冒號和基類?) – developer10

+1

@如果你的問題中顯示的內容不正確,那麼你應該編輯它以顯示你實際使用的內容。至於我的回答,我展示的是準確的。 –

1

不能在純粹的聲明中指定的成員初始化列表,

B(param1OfA, param2OfA, params) :A(param1OfA, param2OfA); 

作出這樣的

B(param1OfA, param2OfA, params); 

此外,還有在了缺少分號本班defini結束了重複:

class A{ 
    ... 
    public: 
    A(params); 
} 
相關問題