PIXNET Logo登入

<font face="新細明體"><B>蕭沖的書房</font>

跳到主文

各種知識的象牙塔

部落格全站分類:數位生活

  • 相簿
  • 部落格
  • 留言
  • 名片
  • 10月 23 週四 200805:19
  • 使用VC與BCB開發的DLL

⓪編著 :蕭沖
首先,請參照下面重要的export function name的規則。
__________________________________________________________________
呼 叫 慣 例 原 始 函 式 Borland C++Builder Microsoft Visual C++
__cdecl MyFunc_cdcel _MyFunc_cdcel MyFunc_cdcel
__stdcall MyFunc_std MyFunc_std _MyFunc_std@8
__fastcall MyFunc_fast @MyFunc_fast @MyFunc_fast@8
-----------------------------------------------------------------------
(繼續閱讀...)
文章標籤

aftcast 發表在 痞客邦 留言(1) 人氣(11,997)

  • 個人分類:BCB
▲top
  • 10月 23 週四 200805:19
  • BCB6 and BCB2006 components installation guide

BCB6與BCB2006控件的安裝
--------------------------------------------------------------------------------
來源:http://www.ccrun.com 作者:不詳
一、安裝步驟:(這是廢話)
1、拿到源碼,要全部源碼,不要那種只有部分源碼的包,。
2、找到BPK文件,如果只有DPK文件,那就用DPK2BPK程序(網上下載)生成一個BPK文件,如果生成失敗,那就自己新建一個包(BPK或bdsproj),把DPK文件中包含的pas文件包含進去。
3、編譯與安裝。
二、注意事項:
1、Bpl包的重名問題,主要是不能重名,在Borland 與 system32下查找要安裝的包的名字,如果找到全刪除掉。
2、文件的重名問題,.pas.h.hpp.dcu.obj.lib.bpl.bpi.dfm.res 等文件均不應有重名現象,如果有應刪除舊版本文件。這裡介紹一個軟件完成這項工作Beyond Compare,其主頁是http://www.scootersoftware.com/
3、文件路徑的設定,編譯查找路徑,鏈接時查找庫文件的路徑,BCB2006的路徑設定會多一點,把Bcc32 Dcc32 ilink32 tasm32 等分開設定,這些均要一一設定正確,並注意先後次序對編譯器的影響。這3點注意事項要時刻想起,出了問題要先查證無誤。不要因為這些問題而讓自己陷入泥潭,那不值得。
三、編譯鏈接中的常見錯誤及排錯方法
1、找不到obj或dcu文件。看看你的硬盤是不是有這麼個文件,如果有那就是第二步所說的路徑問題。
2、如果文件沒加入項目,那是不會生成鏈接所需要的obj及lib文件的。這時要注意編譯多個包時的先後次序。
3、編譯開關控制文件,控件包代碼中的編譯開關一般放在一個文件(.inc)中,如果為pas後綴請改名。類似於下面代碼,如果在BCB2006下安裝,就要自己修改這個文件。
{$IFDEF VER180} //如果是用BDS2006編譯
{$IFDEF BCB} //BCB2006
{$DEFINE VER140} //那麼採用B6一樣的編譯開關
{$ELSE} //Delphi2006
{$DEFINE VER170} //那麼採用D9一樣的編譯開關
{$ENDIF}
{$ENDIF}
要用正確的編譯開關才能編譯正確。至於如何改,那要看具體的文件才行,這個一般也不難改。
4、關於DesignEditors這個單元的問題 , DCP文件的使用。
在BCB2006中,PAS代碼如果包含了這個DesignEditors單元,會引起編譯失敗,原因是BCB2006並沒有提供DesignEditors所要的全部源碼,這裡會提示說找不到Proxie這個文件。可是還是有方法安裝的。解決方式是通過.dcp(Delphi Compiled Packages)文件:
在 Project Options -- Pascal Compiler(Dcc32) -- Other Options 頁 ,有個use package .dcps when compling , 把其選上,同時填上所要的.dcp文件的名字,DesignEditors所需要的.dcp名字是designide(只填名稱就可以了,不要加後綴名哦),填上所要的dcp文件後,DesignEditors的問題得以解決。
在BCB6中,則是將這個dcp文件加入項目,或指定連接對應的lib文件。
5、代碼中的編譯錯誤
這裡指安裝在B2006的控件才會碰上,因為控件沒有for 2006 的,所以才有這問題,過一段時間控件升級,就沒這種問題了。
這只能是見招拆招了,沒有其他辦法。如rxlib中的變量與B2006的TControl新增屬性重名, ehlib中的因2006中TFieldType類型的增加要增加相對應的匹配項。
6、通過編譯後鏈接時出現的錯誤。 這就是眾人討厭的link av 錯誤
出現這類型錯誤時,首先要記得檢查上面說的注意事項,然後才進行後續的排錯工作。切記。這時要進行的也就是修改項目文件了。
這個在BCB6或BCB2006測試版中支持都不好,正式版還未知如何。是一個大毛病,令人心煩。如果有多個包要修改,建議使用工具UEdit32來輔助這項工作。在外部修改了包文件後要在BCB中關閉該項目重新打開後才生效,不要被BCB那個提示迷惑了。
要修改包文件,先介紹一下包文件的內容 :(Borland真應該自己做出一個工具修改自己的包文件)
bpl項目文件用XML格式,大部分一看就明白,說一下與linker有關的部分。
&lt;LINKER&gt;
&lt;ALLOBJ value="c0pkg32.obj $(PACKAGES) Memmgr.Lib sysinit.obj $(OBJFILES)"/&gt;
&lt;ALLRES value="$(RESFILES)"/&gt;
&lt;ALLLIB value="$(LIBFILES) $(LIBRARIES) import32.lib cp32mti.lib"/&gt;
&lt;OTHERFILES value=""/&gt;
&lt;/LINKER&gt;
這裡: $(PACKAGES) 是指上面定義的 PACKAGES value 的全部。$(OBJFILES).ALLOBJ ALLRES 這兩項一般不出現什麼問題。
ALLLIB 這項問題多,是LINK AV錯誤的發源地之一。裡面有兩大類:$(LIBFILES) $(LIBRARIES value)
$(LIBFILES) //BCB2006是小寫,B6是大寫。libraries
$(PACKAGES) //packages
$(SPARELIBS) //sparelibs
看看裡面就知道Bolrand做了些什麼,有時會有一大堆沒用到的包與庫都放在那,這裡Borland做得真差勁。
如果你安裝了很多包,那麼存盤的時候所有的包與庫都將寫到這裡面,別人如果沒有這個包就會出錯。這問題很弱智,但Borland就是這麼做。
把你項目中不用到的包與庫刪除掉。鏈接時也就不會報找不到什麼什麼庫了。
可是還是出現link AV ,這時可能出在 libraries 項,檢查libraries項,把重名的刪除(還會出現重名的borland真是),重排一下次序。
sparelibs項如果混亂就設成與libraries一樣。如果你的項目要鏈接vclsmp.lib,手工在這加上,不少lib在IDE中加不上的都在這手工加上。
設定這裡的庫列表需要對這些lib庫的熟悉,如果不清楚,可copy一另一個項目的libraries項過來試試看。
FILELIST 項,BCB可能會有一些沒用的文件也在其中,這裡會造成找不到這文件的錯誤。檢查一下,刪除訪該項即可。如果路徑不對,也改對它吧。
我就是通過修改libraries packages sparelibs FILELIST 解決了不少link av錯誤。其他選項在project->Optons都能設定,但這幾項只有手工改文件。
注意一定要先對上面提到的注意事項仔細做一遍。
關於Uedit
用UEdit可以查找函數出現在哪個lib或bpi文件中,從而知道該鏈接哪個lib。使用哪個bpi。當做內容替換時Uedit也很體貼。正確地連接lib bpi文件及使用dcp文件,可解決使用Borland沒給出源碼的那部分單元鏈接失敗的問題(全編譯時失敗)
關於B2006下安裝可參考: http://community.csdn.net/Expert/topic/4440/4440033.xml?temp=.9818537
我把自己在處理包的一些方法寫下來,供大家參考,希望能得到指正。這方面找不到Borand的Help,就做一下拋磚引玉的動作了。這些錯誤老是令人心煩不已。每次裝控件總忙個不停很煩,這本來就不是程序設計本身的事情呀。
PS. 蕭沖補dpk2bpk的使用: 它針對BCB6來處理,若是其它版本則可用同一作者的dpk2cpp產生package用的cpp檔,然後再由BCB的IDE來自行產生一個PACKAGE,含入此cpp。
(繼續閱讀...)
文章標籤

aftcast 發表在 痞客邦 留言(0) 人氣(866)

  • 個人分類:BCB
▲top
  • 10月 23 週四 200805:17
  • 後記Pointer(指標/指針/指位器)的宣告/定義風格

⓪著作 :蕭沖
資料的變數是為了方便找資料(memory address 的alias)。
型別則是為了資料「取出後」該用什麼方式處理與呈現。
我們都知道在電腦世界裡,所有資料的最後結構都是010101…二進位。型別則讓我們可以分門別類的把010101的資料做不同的詮釋以呈現我們人類所可以理解的資訊。
Pointer是為了存取資料的方式不同而生,它該是屬於定址問題,也就是說它和變數是該是「同一夥」的!
Type Variable 我的說詞是: 用「直接定址法存取」,資料型別是Type,稱直接變數。
Type *Variable 用「間接定址法存取」,資料型別是Type,稱間接變數。
關於定址法,請參照組合語言(Assembly Language)。
最後被存取的資料才是我們重視的,所以最後被存取的資料型別才是我們關心的,而Pointer雖然也是資料的一部份,但放的都是位址資料,這些位址資料只是為了靈活的操作我們在意的最終資料。
我們在意的資料型別是什麼? 就是 int, char, float, double, stuct, class.....等對人有價的資料。我想,單純的pointer type對我們來說只是存取資料的過程用,並非我們最後想看的吧!
(繼續閱讀...)
文章標籤

aftcast 發表在 痞客邦 留言(1) 人氣(1,073)

  • 個人分類:C/C++
▲top
  • 10月 23 週四 200805:16
  • 關於Pointer(指標/指針/指位器)的宣告/定義風格

⓪編著 :蕭沖
時間:20060826
許多人都在爭議c/c++的pointer的宣告/定義風格:
type *var1; // code standard 1
type* var2; // code standard 2
似乎第二種方式比較容易讓人了解,但是事實上那樣的風格並不"正確"。
使用第二種風格有一種限制: 不能連續宣告
type* var3, var4 // 只有var3是pointer,var4是一般的變數
就compiler與從assembly的觀點來看,第二種方式才是對的。
每個變數名都代表著memory的位址,變數名只是方便讓我們不用去記憶每個放資料的位址。ASM裡有幾種定址方(addressing):
1/port addressing
2/register addressing //使用register來放資料
3/immediate addressing //直接給常數值
4/memory direct addressing //使用memory的位址放資料
5/memory indirect addressing //使用registers內容所記的位址放資料
4 的方式就像我們宣告一般變數名處理資料一樣
5則像是pointer 或是 array 間接的取資料
在ASM裡,使用[ ]符號來把register包起來,表示資料是放在這個register內資料所記載的位址,而非register的內容。[register]就像是把一般的變數加上一個[ ]的符號來表示它是用間接的方式來取值!就如同C/C++中用*來表達間接取值。
3的方式亦可見於const變數。當變數定義成const時,以後的存取方式都是以直接給值的方式來組譯。我們知道const int 與 int const 是一樣的宣告,如同pointer一樣,個人覺得用int const的方式才是"對"的。而且可以容易了解 int *const ptr的意義就是唯讀指標/針。把const variable翻成立即定址法!
再用個現實例子來說明一下變數與指標:
比如說你有數個倉庫,它們的門牌號碼是100號,103號,108號。100號裡放的是褲子,103號放的是上衣,108號放的是帽子。當我要請工人去拿上衣的時候,我就會說:請去103號拿庫存。經過一陣子,我們的倉庫變更多了,有好多的門牌號,110,111,120,131…我們自己都快記不住哪個號碼是放什麼。於是我們就想了個方法,即在門前貼上貼紙: 把100號貼上一個褲子的圖,把103號貼衣服的圖,把108號貼帽子的圖…當我們想要拿褲子的時候,我們不再告訴工人去100號拿,而是告訴工人去「貼有褲子的倉庫」拿貨。
上面的例子裡,門牌就相當於memory的位址,而貼紙就像是變數名。
那什麼情形是pointer呢? 比如說我們有一批臨時的食品乾貨,當貨來到倉庫時必需因應當時的倉庫使用情形而暫放在某個門牌號,等工人把貨確定放好位子後再回報放在哪個門牌上。為了這種臨時性的需求,我們開了一個門牌號,比如說140號,並也貼了一張辨識用的「食品記錄本圖」,然而裡面不放一般的貨,只放一個記錄本,上面會有工人回報門牌的記錄。於是當我們要工人去拿這臨時貨時,我們會說:去140號查記錄本,然後再去所記錄的門號拿貨來!
這個記錄圖就是代表pointer變數。
一般的圖和「記錄本圖」有什麼不同? 就是拿貨的方式不同。看到一般圖就進倉庫直接拿貨,看到記錄本圖就只道要進去查記錄本,再到確定的地方取貨。從這裡可以了解,貨品本身是哪一類的並不重要,重要的是圖哪一種圖!不同的圖代表不同的取貨方式。因此,你可以想像為何要用
type *var 的宣告。因為var和*var是不同的,var是去var的地位直接拿,*var是到var的地方去查本取貨,僅管這二個的貨品都是同一類的。
這麼說來,你能了解為何我說 type* var是看似合理,但並非根子裡是那樣的。也因此了解為何c/c++中
type* var1, var2 只有var1被compile成pointer。
*號應該看做是變數名的Qualifier(修飾詞),而非type與type結合。
(繼續閱讀...)
文章標籤

aftcast 發表在 痞客邦 留言(0) 人氣(2,068)

  • 個人分類:C/C++
▲top
  • 10月 23 週四 200805:16
  • BCB 上安裝 indy 9 的所有重要事項與筆記

◎蕭沖 編著

下載位置更新如下:
http://www.indyproject.org/Sockets/Download/Files/Indy9.EN.aspx
下載9.0.18與9.0.17,把9.0.18蓋9.0.17,把被蓋過的9.0.17拿來當成9.0.18用 (主要是因為要他的17的bat檔)
(繼續閱讀...)
文章標籤

aftcast 發表在 痞客邦 留言(0) 人氣(4,811)

  • 個人分類:BCB
▲top
  • 10月 23 週四 200805:15
  • 以C語言觀點理解C++的this指標/指針

⓪著作 :蕭沖
我常用低階的語言觀點來看高階語言,我覺得那樣可以更深入的了解使用法方,堪至可以模擬出是如何實做的,可能遇到的問題。能想像Bjarne Stroustrup這個創造人當初可能是怎麼想的嗎?
這篇文章最主要的目的是要解釋為何需要用this指標?
前言:想像一下在沒有class之前,C語言程式設計師是如何達成近class模組化功能? 曾看過一些使用C開發的遊戲程式,裡面總定義了一堆的struct,當然還有一堆和這struct有關的function。在cpp裡struct和class是同樣的,都可以定義資料成員(data member)、成員函式(member function/method),僅差別在struct預設成員是public。然而在C語言裡,struct是不能有成員函式定義的,也因此C程式人員可能獨立的把方法寫在Global區塊上,是否可能模擬出把方法也嵌入struct中呢? 這樣就很像class了…請看以下我寫的演示範本:


#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef
struct StudentInfo
{
char *mName;
int mAgeInAc;
int mAgeInTw;
void (*mpCalc)(struct StudentInfo *self);
int (*mpGetTwAge)(struct StudentInfo *slef);
void (*mCopy)(struct StudentInfo *slef,
struct StudentInfo *src);
}STI;
/* 私人的方法 */
void ac_to_tw(STI *self)
{
self->mAgeInTw = self->mAgeInAc - 1911;
}
/*公開的方法*/
int get_tw_age(STI *self)
{
self->mpCalc(self);
return self->mAgeInTw;
}
/*公開的方法*/
void copy(STI *self, STI *src)
{
*self = *src;
}
/*建構子*/
STI create_sti_object(void)
{
STI object;
object.mName = 0;
object.mpCalc = ac_to_tw;
object.mpGetTwAge = get_tw_age;
object.mCopy = copy;
return object;
}
/*動態建構子*/
STI *p_create_sti_object(void)
{
STI *p_object = (STI *) calloc(1,sizeof(STI));
p_object->mName = 0;
p_object->mpCalc = ac_to_tw;
p_object->mpGetTwAge = get_tw_age;
p_object->mCopy = copy;
return p_object;
}
/*動態解構子*/
void destroy_sti_object(STI *self)
{
free(self);
}
#pragma argsused
int main(int argc, char* argv[])
{
int my_tw_age;
STI student_info;
STI *p_student_info;
STI my_info;
STI babe_info;
STI copy_info;
/*沒有建構式的建立法*/
student_info.mName = "蕭一世";
student_info.mAgeInAc = 1951;
student_info.mpCalc = ac_to_tw;
student_info.mpCalc(&student_info);
printf("%s 民國%d年生\n",student_info.mName,student_info.mAgeInTw);
/*使用動態建構方式,且直接呼叫私人方法*/
p_student_info = p_create_sti_object();
p_student_info->mName = "蕭二世";
p_student_info->mAgeInAc = 1961;
p_student_info->mpCalc(p_student_info);
printf("%s 民國%d年生\n",p_student_info->mName,p_student_info->mAgeInTw);
destroy_sti_object(p_student_info);
/*使用建構子,且呼叫公開方法取回值,Instance1 */
my_info = create_sti_object();
my_info.mName = "蕭沖";
my_info.mAgeInAc = 1971;
my_tw_age = my_info.mpGetTwAge(&my_info);
printf("%s 民國%d年生\n",my_info.mName,my_tw_age);
/*使用建構子,且呼叫公開方法取回值,Instance2A */
babe_info = create_sti_object();
babe_info.mName = "寶貝";
babe_info.mAgeInAc = 1976;
my_tw_age = babe_info.mpGetTwAge(&babe_info);
printf("%s 民國%d年生\n",babe_info.mName,my_tw_age);
/*使用拷備函式,Instance2B */
copy_info = create_sti_object();
copy_info.mCopy(& copy_info, &babe_info);
copy_info.mName = "寶貝拷備";
copy_info.mAgeInAc = copy_info.mAgeInAc + 7;
my_tw_age = copy_info.mpGetTwAge(& copy_info);
printf("%s 民國%d年生\n",copy_info.mName,my_tw_age);
system("pause");
return 0;
}



我們使用了函式指標來實作「方法」的部份。值得注意的部份是:從這裡我們可以看出方法的部份是共享的,僅資料的部份是各自不同(參考最後二個instance)。使用建構式是為了要把方法與Global下的function連結起來,這也是cpp中的一個新觀念-「建構子」。但在這裡還沒有實作出public與private的限制,也就是data hiding的部份。上面的方法中,都有一個參數STI *self這就是為何cpp中的method需要*this的原因了!只是cpp中把這個參數給隱藏起來,在complie時在偷偷的插入這個pointer到最前面的參數,並在method中關於data member和member function的部份加上this->,就如同上面的範例使用了self->。這樣就可以達成「Instance的方法共享,資料私有」。free後method的部份依舊存在。僅data被free了!
範例子寫了一個copy method,演示了cpp中何時你可能會把this這個關鍵字用出來,當實作copy時,你就要自己寫入 *this 這就不是compiler會幫你的了! 還有另一個可能會用到的時候: 傳回物件的reference時return *this,不過這是在reference type 是cpp裡才有的。
(繼續閱讀...)
文章標籤

aftcast 發表在 痞客邦 留言(1) 人氣(13,884)

  • 個人分類:C/C++
▲top
  • 10月 23 週四 200805:13
  • BCB project (bpr) file 的手動修正方式筆記

◎蕭沖原創
經常會拿到別人的source code回來compile,於是遇到原來的bpr檔資料和本機的有所出入,就出現一堆的錯誤。所以,稍深入的觀察bpr和project option的關係後,寫下這筆記!
◎修改project的bpr(xml)檔時,最好是在非IDE的情形下。不然經常會被IDE給overwrite。 
下次又變成原來的樣子。
◎FILELIST放有整個project會用到的source code,注意是否有要增或刪或改的地方。
◎當「使用」dynamic RTL時,對應的project xml檔裡有下面的變化:
&lt;SYSDEFINES value="NO_STRICT;_RTLDLL"/&gt;
&lt;LINKER&gt;
&lt;ALLOBJ value="c0w32.obj Memmgr.Lib sysinit.obj $(OBJFILES)"/&gt;
........
&lt;ALLLIB value="$(LIBFILES) $(LIBRARIES) import32.lib cp32mti.lib"/&gt;
&lt;/LINER&gt;
1/ 多了 _RTLDLL
2/ 多了 Memmgr.Lib
3/ cp32mt.lib 變成 cp32mti.lib (注意i結尾)
◎當「不使用」Build with runtime packages時會有下面的變化:
&lt;LIBRARIES value="dbrtl.lib vcldb.lib vclx.lib bcbsmp.lib rtl.lib vcl.lib TntLibR.lib"/&gt;
&lt;SYSDEFINES value="NO_STRICT;USEPACKAGES"/&gt;
&lt;ALLOBJ value="c0w32.obj $(PACKAGES) sysinit.obj $(OBJFILES)"/&gt;
1/ LIBRARIES中原本無值,但不使用package時則多了一堆lib
2/ 多了 USEPACKAGES
3/ 多了 $(PACKAGES)
◎當回復「使用」Build with runtime packages時:下面的系統lib會清空,「但第三元件不會」
&lt;LIBRARIES value="TntLibR.lib"/&gt;
◎&lt;SPARELIBS/&gt; 與 &lt;LIBRARIES/&gt;的問題: &lt;&lt;!注意,僅在未使用Build with runtime packages時&gt;&gt;
當二者不match時,會以SPARELIBS來重建LIBRARIES。以SPARELIBS為主!
◎多數問題出現在&lt;SPARELIBS/&gt; 與 &lt;LIBRARIES/&gt;。適當的刪除/增加第三元件的lib非常有用。
(繼續閱讀...)
文章標籤

aftcast 發表在 痞客邦 留言(0) 人氣(2,481)

  • 個人分類:BCB
▲top
  • 10月 23 週四 200805:12
  • 複習C++ Class間的Overload、Override、Hide

⓪編著 :蕭沖
複習一下過去的學習。
當Base Class裡的method與Derive Class中的method形成Overload的情形時,Base中的那些同名method都會被Hide起來。若是試著去使用Base中的那些method時,就會產生error。但可以把instance upcast後使用那些Hide的method,然而這時候Derive中的那些method也會變成無法使用。這個規則無論是Overload一個Base的Virtual或是非Virtual的method都適用!
當Derive Class中Redefine(同名同signature) Base Class中的method時,若此base 的method是Virtual的,那就會產生Override(覆載)。但若base method非Virtual的,那就會產生Hide的情形。
Overload : 同名但不同簽名(signature)
Override : 同名同簽名的Virtual method被再定義
Pure Virtual method不可使用inline方式定義method,但可以使用外部定義的方式。這樣每個子類別就可以方便以Interface::method的方式直接取用。但一般來說是不會在interface上定義method的。
(繼續閱讀...)
文章標籤

aftcast 發表在 痞客邦 留言(0) 人氣(6,792)

  • 個人分類:C/C++
▲top
  • 10月 23 週四 200805:01
  • 物件初始化 -- C style Vs Cpp style

⓪著作 :蕭沖
傳統C語言裡若要初始物件(結構體struct),需使用{ }陣列初始的方法來初始之。但已經不合用於cpp中的class型別,初始化的方式已有所不同。c中使用bitwise copy,一個byte一個byte的copy值。但class中有constructor,並非是簡單的bit copy就可以的。此外,C的其他型別都是用 = 號來初始值。在cpp中擴展了初始化的方法,即用()來做。如: ClassType obj(data); 為了和C的包伏問題,也可以使用 ClassType obj = data來代表同一件事。當然,當建構子的參數超過一個以上你就只能ClassType obj(data1, data2, data3);
cpp裡還有一個功能,允許operator被overloading。於是 = 號則也可能被overloading。造成了某些觀念上會有誤解。比如說:
Foo rhs;
String obj = rhs // statement A
String obj; obj = rhs ; // statments B
A 與 B 這二種寫法是一樣的嗎?
「通常」是一樣的結果,但根子裡是不一樣的。
第二種的寫法compile是先用default constructor先創出一個String物件。然後再使用String裡的 = operator 複載(overload)來做物件copy。值得注意的是當用 = copy時,左右二邊的型別決定了是否可copy。
第一種則單純依overloading 的constuction的型別媒合而create一次!
問題通常會發生在一個物件它的建構子的所有overloading型別與它自己 = operator 的overloading的型別不全然一樣!
實例說明: 以以BCB中Variant這個類別來說
它的reference construction overloading裡有 short*, int*.........
它的 = operator 則是 Variant& __fastcall operator =(const Variant& rhs);
也就是說它接等號右邊可以是 Variant&,說明檔裡更指出如下:
If the Variants can be converted to types that make sense for the given operation, the assignment is performed
好了,實驗一下:
Variant vv =cat->get_ActiveConnection(); // wrong! no such constructor match
Variant vv;
vv = cat->get_ActiveConnection(); //using Variant::operator= overload is match,ok!
結論:
1/ ClassType obj = rhs 與 ClassType obj(rhs) 是等價的! 但用cpp style ( ) 在bcb中會在design time 出現有錯誤,但不用理會。
2/ ClassType objA; objA = rhs ; 這二行就不一定等於上面1說講的一樣。
3/ 我建議使用cpp style 來初始建構,這樣比較不會被 = 號給搞亂了。因為 = 時而是用建構子,時而又是表達二個物件copy。
4/ 是否要分二行陳述則要依情形來看。以剛我講的例子就需要二行。若是一般情形則用一行就可以。而我個人又強力的建議使用cpp的( ) 建構型態!
5/ 一行的效能一定比二行好,所以不要全都使用二行的方式!!
(繼續閱讀...)
文章標籤

aftcast 發表在 痞客邦 留言(1) 人氣(1,248)

  • 個人分類:C/C++
▲top
  • 10月 23 週四 200804:11
  • Big5 GB2312 convert 繁簡轉換

原作者: 不詳
加註 : 蕭沖
/*
蕭沖 於20051017注記
從下面的程式可以猜測出
1/ GBK字集裡含有繁體字型與簡體字型
2/ GBK裡的繁體字型部份轉為Unicode後便與Big5轉為Unicode後的值是一樣的
3/ 使用LCMapString函數可將GBK裡的繁與簡字體做內碼映射轉換
(繼續閱讀...)
文章標籤

aftcast 發表在 痞客邦 留言(1) 人氣(10,823)

  • 個人分類:BCB
▲top
«1...345»

自訂側欄

自訂側欄

自訂側欄

大頭貼

aftcast
暱稱:
aftcast
分類:
數位生活
好友:
累積中
地區:

近期文章

  • DELPHI / C++ Builder 使用DDE client時出現亂碼問題
  • XE C++ builder 不能 source debug的原因
  • Windows 7 IE9 IE10 藍畫面 藍屏
  • xcode裡的git (source control->commit)無法成功
  • Windows Runtime ( WinRT) 的精簡介紹筆記
  • verify_signer_identity: Could not copy validate signature: -402620393
  • 我的iphone app --首創電話即時計費與通話警示軟體-電話王
  • CB 當畫面放了許多且很大的圖後無法debug
  • 民國100年5月1日勞動節遇星期日是否該補一天假??
  • open source 的GPL LGPL Apache MIT BSD 等 license 版權的問題 與感染 分析

最新迴響

  • [22/06/09] 路人 於文章「貼2002年文章 : 愛情的烏托邦...」留言:
    愛情烏托邦? 一個只有你跟我不被打擾污染的世界,進去不想被叫...
  • [18/02/23] Peter 於文章「Thread-Safe的理解與分析...」留言:
    您好,想請問讓不安全的thread變安全得第二種方法中, 只...
  • [16/04/18] Ben Chan 於文章「C++中關於extern "C"的意義...」留言:
    THX 大神!...
  • [15/04/30] wefuntw 於文章「C++中關於extern "C"的意義...」留言:
    讚! 大解惑!!! ...
  • [15/03/29] 溫啟清 於文章「Thread-Safe的理解與分析...」留言:
    若什麼是auto變數、stack都還不清楚,推薦閱讀"程式設...
  • [13/12/27] Kristi Huang 於文章「我的iphone app --首創電話即...」留言:
    請問未來是否會更新適用威寶的費率,很期待能使用您開發的APP...
  • [12/06/07] 訪客 於文章「Thread-Safe的理解與分析...」留言:
    很好,很容易理解,淺顯易懂。真厲害!...
  • [11/12/10] 長工老王 於文章「Thread-Safe的理解與分析...」留言:
    那call 副程式,算不算安全呢 ...
  • [11/11/11] EE 於文章「Socket mode Note...」留言:
    這水桶比喻還真的完全的看不懂阿~~~...
  • [10/11/10] RURU 於文章「Thread-Safe的理解與分析...」留言:
    Thread-Safe本身就是一種藝術啊~~~~~~讚!...

文章彙整

文章分類

toggle 電腦維修 (1)
  • 電腦維修 (1)
toggle 軟體程式設計 (7)
  • BCB (15)
  • Win32 (7)
  • C/C++ (7)
  • Assembly (1)
  • Web (1)
  • visual studio c++ (1)
  • iPhone develop (1)
  • IT相關 (1)
  • Life (4)
  • 未分類文章 (1)

部落格文章搜尋

誰來我家

參觀人氣

  • 本日人氣:
  • 累積人氣: