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

關於new 一個新的物件

答題得分者是:aftcast
qqmts0726
一般會員


發表:11
回覆:6
積分:8
註冊:2008-06-27

發送簡訊給我
#1 引用回覆 回覆 發表時間:2011-01-20 10:28:56 IP:61.20.xxx.xxx 訂閱
 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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2011-01-20 13:35:53 IP:210.64.xxx.xxx 訂閱
有疑問就問,這真的是進步的動力。正所謂:「學而不思則罔」,你問的好! 比完全不理會,反正照著用這樣的學習好很多!

>> 一直想不透,這樣可以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
編輯記錄
aftcast 重新編輯於 2011-01-19 22:37:18, 註解 無‧
aftcast 重新編輯於 2011-01-19 22:37:59, 註解 無‧
系統時間:2024-04-25 0:17:05
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!