線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:2022
推到 Plurk!
推到 Facebook!

請問類別、建構子、繼承問題

答題得分者是:aftcast
pireer
初階會員


發表:73
回覆:80
積分:30
註冊:2004-12-14

發送簡訊給我
#1 引用回覆 回覆 發表時間:2007-09-06 09:16:59 IP:61.220.xxx.xxx 訂閱
我是用最基本的class來測試...T1為祖類別...T2為父類別..T3為子類別...ㄧ直繼承下來
但我這樣寫編譯時會錯.
[C Error] Unit1.cpp(29): E2247 '_fastcall T1::T1()' is not accessible
好像是加了建構子的問題..但我不知道為什麼錯.
請前輩們指點..

.h檔 .cpp檔
<textarea rows="20">class T1 : public TObject { private: __fastcall T1(); __fastcall ~T1(); public: }; class T2 : public T1 { private: __fastcall T2(); __fastcall ~T2(); public: }; class T3 : public T2 { private: __fastcall T3(); __fastcall ~T3(); public: }; </textarea><textarea rows="20">__fastcall T1::T1():TObject() { // } //---------------- __fastcall T1::~T1() { // } //---------------- __fastcall T2::T2():T1() { // } //---------------- __fastcall T2::~T2() { // } //----------------- __fastcall T3::T3():T2() { // } //------------------ __fastcall T3::~T3() { // } //------------------</textarea>
編輯記錄
pireer 重新編輯於 2007-09-06 09:21:37, 註解 無‧
Stallion
版主


發表:52
回覆:1600
積分:1995
註冊:2004-09-15

發送簡訊給我
#2 引用回覆 回覆 發表時間:2007-09-06 10:34:06 IP:211.22.xxx.xxx 未訂閱
C++書裡面有提到,一個類別的 constructor, desturcotor 一定是 public 屬性!所以當然編譯不過~
編輯記錄
Stallion 重新編輯於 2007-09-06 11:00:46, 註解 無‧
pireer
初階會員


發表:73
回覆:80
積分:30
註冊:2004-12-14

發送簡訊給我
#3 引用回覆 回覆 發表時間:2007-09-06 11:43:39 IP:61.220.xxx.xxx 訂閱
我剛測試後..的確建構子與解構子放到public後就可以編譯..
但我還有個問題..如果T2與T3繼承的類別是TObject...
且T2與T3建構子函是後面改為呼叫TObject...
這樣建構子在private下也是可以編譯...
請前輩指點差異..

===================引 用 Stallion 文 章===================
C++書裡面有提到,一個類別的 constructor, desturcotor 一定是 public 屬性!所以當然編譯不過~
Stallion
版主


發表:52
回覆:1600
積分:1995
註冊:2004-09-15

發送簡訊給我
#4 引用回覆 回覆 發表時間:2007-09-06 11:56:09 IP:211.22.xxx.xxx 未訂閱
不懂你在說啥?寫出來看看~
===================引 用 pireer 文 章===================
我剛測試後..的確建構子與解構子放到public後就可以編譯..
但我還有個問題..如果T2與T3繼承的類別是TObject...
且T2與T3建構子函是後面改為呼叫TObject...
這樣建構子在private下也是可以編譯...
請前輩指點差異..
===================引 用 Stallion 文 章===================
C++書裡面有提到,一個類別的 constructor, desturcotor 一定是 public 屬性!所以當然編譯不過~
aftcast
站務副站長


發表:81
回覆:1485
積分:1763
註冊:2002-11-21

發送簡訊給我
#5 引用回覆 回覆 發表時間:2007-09-06 17:45:30 IP:60.248.xxx.xxx 訂閱
>> C++書裡面有提到,一個類別的 constructor, desturcotor 一定是 public 屬性!所以當然編譯不過~

補一下完整的正確觀念! 一般的情形下建構子與解構子是public的,這樣才可以在calss外面被create。但是,事實上二者都是可以被宣告成private的。其中,當建構子被放在private時,就是有名的singletons pattern。是為了確保instance只能有一個的做法!

用個實例給你看,但因為個人時間少沒能自己幫你寫個例子。就拿別人寫的例子給你看,是發表在code project網站上的程式。
<textarea class="cpp" rows="10" cols="60" name="code">/* Creational Pattern: SINGLETON Author: Rajesh V.S Language: C Email: rajeshvs@msn.com */ #include using namespace std; class Singleton { private: static bool instanceFlag; static Singleton *single; Singleton() { //private constructor } public: static Singleton* getInstance(); void method(); ~Singleton() { instanceFlag = false; } }; bool Singleton::instanceFlag = false; Singleton* Singleton::single = NULL; Singleton* Singleton::getInstance() { if(! instanceFlag) { single = new Singleton(); instanceFlag = true; return single; } else { return single; } } void Singleton::method() { cout << "Method of the singleton class" << endl; } int main() { Singleton *sc1,*sc2; sc1 = Singleton::getInstance(); sc1->method(); sc2 = Singleton::getInstance(); sc2->method(); return 0; } </textarea>
回到主題,你的問題應該是你試著在class外面去create一個instance造成的!
------


蕭沖
--All ideas are worthless unless implemented--

C++ Builder Delphi Taiwan G+ 社群
http://bit.ly/cbtaiwan
編輯記錄
aftcast 重新編輯於 2007-09-06 17:48:50, 註解 無‧
系統時間:2024-05-02 7:41:11
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!