關於new 一個新的物件 |
答題得分者是:aftcast
|
qqmts0726
一般會員 發表:11 回覆:6 積分:8 註冊:2008-06-27 發送簡訊給我 |
Dear all:
印象中,通常我們在new 一個物件的寫法應該是 TA A = new TA(XXX); 但是最近看到有人是這樣寫得。 主頁面是Form1 ,同時有頁面Form2。 在主頁面裡面有一個按鈕是 Create Form2。 寫法如下: #include #pragma hdrstop #include "Unit1.h" #include "Unit2.h" // Form2 void __fastcall TForm1::Button1Click(TObject *Sender) { Form2 = new TForm2(this); Form2->ShowModal(); } //--------------------------------------------------------------------------- 一直想不透,這樣可以new 物件的原理是何? 且這樣new的時候,似乎沒有辦法從 其他cpp include 到Form1->Form2...... 所以這樣的寫法?是正確的寫法還是會有怎麼樣的問題呢 |
aftcast
站務副站長 發表:81 回覆:1485 積分:1763 註冊:2002-11-21 發送簡訊給我 |
有疑問就問,這真的是進步的動力。正所謂:「學而不思則罔」,你問的好! 比完全不理會,反正照著用這樣的學習好很多!
>> 一直想不透,這樣可以new 物件的原理是何? 因為: 1 / Unit2.h 裡有一句話 extern PACKAGE TForm2 *Form2; // 當你include這header檔時,就引用了這個 「宣告」它表示在某個檔案裡會定義TForm2 *Form2; 2/ Unit2.cpp 的上面,有一句話 TForm2 *Form2; // 這裡 「定義」了這個指標變數。 定義與宣告的不同在於,定義是compiler後占有記憶體空間的實體。 因為上面的二點,所以可以Form2 = new TForm2(this); 而不使用 TForm2 *Form2 = new TForm2(this); 而且 也不能再這樣用,因為Form2之前定義過了! >>且這樣new的時候,似乎沒有辦法從 其他cpp include 到Form1->Form2...... 因為Form2並非定義在Form1裡面,而是義定在Unit2.cpp 上,所以你只能用 Form2-> >>所以這樣的寫法?是正確的寫法還是會有怎麼樣的問題呢 寫法是正確的(不當然就compiler不過了,不是嗎?) 但這樣的程式寫作方式…我只能說, "一般來說" 很差!! 因為他用ShowModal();的方式來show出來; 而這個方式通常都會是結束form2時,form2就跟著該delete掉,所以,一般會這樣寫 TForm2 *foo = new TForm2(0); // foo 是區域變數,注意到建構中放0,是因為我們會自己刪除,而不是靠form1將死的時候,順便殺了form2,不用this foo->ShowModal(); bar = foo->abc; // 這是舉例 delete foo; 除非很特別的考量才會用Form2這個全域的變數,並刻意不delete。比如說該form2上的資料總是不變的,所以想要從new開始到程式結束都不讓他死。
------
蕭沖 --All ideas are worthless unless implemented-- C++ Builder Delphi Taiwan G+ 社群 http://bit.ly/cbtaiwan |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |