雙分派是指:接受者和參數都能在運行時決定它的類型。(從而若有同名函數的話,依參數選定目標函數)
二. 問題的提出
C++ 不支持雙分派,只支持單分派。也就是說參數的類型將在編譯階段決定。(雖然遇上同名函數的選取時,沒有體現多態,但進入函數后,指針參數或引用參數仍然表現了其多態)
下面的代碼演示了該問題:
using namespace std;
class D;
//B
class B
{
public:
void virtual output(B * b){cout << "B:B" << endl;}
void virtual output(D * d){cout << "B:D" << endl;}
};
class D : public B
{
public:
void output(B * b){cout << "D:B" << endl;}
void output(D * d){cout << "D:D" << endl;}
};
int main()
{
B * p1 = new D;
B * p2 = new D;
p1->output(p2);
return 0;
}

三. 解決方法
Visitor設計模式
在VC6.0中調試Release版本程序
有兩種方法:
1. 在懷疑有錯誤的地方加MessageBox,在函數中顯示可能導致錯誤的變量的值。或者插入寫文件語句。輸出可能導致錯誤的變量的值到一個記錄文件。
2. 在工程中設置
① 在”Project Settings”里選Setting For 為 All Configurations。
② 在C/C++標簽中“Debug Info”選 Program Database。
③ 在link標簽中“Category”選中“Debug Info”復選框和“Microsoft Format”。
現在就可以像在調試Debug中那樣設置斷點進行調試了。由于代碼優化,有些變量觀察不到,行的運行順序也可能不同。
在VS2005中調試Release版本的程序
1. 在工程的屬性設置中,“鏈接”——>“調試”——>“生成調試信息”,選擇“ 是 ”。
2. “C/C++”——>“常規”——>“調試信息形式”,選擇 “/ZI”。
3. “C/C++”——>“優化”,設置“禁用”。
介紹:
Boost使用的編譯系統叫做Boost.Jam(Bjam),是一個基于FTJam的構造工具,而FTJam又基于Perforce Jam
細節:
Jam是make(1)(如果你使用UNIX就知道make(1)是什么,在這里簡單說明,make(1)是指系統工具類中,名叫make的東西)的一個替代品,Jam的目標是讓構造簡單的東西更加容易,而讓構造復雜的東西變得簡單。下面是一個例子:
Main smail : main.c map.c resolve.c deliver.c
misc.c parser.y alias.c pw.c headers.c
scanner.l getpath.c str.c ;
Smail從一打文件進行構造.Jam自動管理依賴的頭文件.
Jam非常易于移植:它能在UNIX,VMS,Mac和NT平臺上.多數Jamfiles在上述平臺上本身就是可移植的.
Jam is unintrusive: it is small, it has negligible CPU overhead, and it doesn't create any of its own funny files (c.f. Odin, nmake, SunOS make).
Jam can build large projects spread across many directories in one pass, without recursing, tracking the relationships among all files. Jam can do this with multiple, concurrent processes.
Jam isn't under the blinkin GNU copyright, so you can incorporate it into commercial products.
構造Boost.Jam
構造好了Bjam以后,要安裝它只需要將生成的執行文件拷貝到PATH變量指定的某個路徑下就可以了。各個平臺都有相應平臺的初始構造腳本用來構造可執行程序。這些腳本都接收一個可選參數,用來編譯構造的工具集的名稱。如果沒有給工具集參數沒有給,或做可用工具集的檢測,并選用一個。構造腳本接受的參數如:
<build script name> [toolset]
無參數的運行腳本可能是最好的選擇。
Boost發布的Boost.Jam的源代碼在BOOST_ROOT/tools/build/jam_src.
如果腳本檢測適當的工具集失敗可能是因為你的工具集不能自動檢測。在這些情況下,你需要在腳本參數那里指定工具集,當然這假定工具集在PATH中可以找到.注意:編譯Boost.Jam的工具集和構造Boost的工具集是獨立的。
lines ending with only a carriage return have been detected. These will be modified to include a line feed.
在對該文件進行單步調試時,實際執行的代碼與看到的錯開了一行,很是郁悶。用Source Insight和UltraEdit對該文件進行編輯和保存,仍不能解決問題。
上網搜索了一下,發現是如下原因:
“有兩種流行的ascII文件格式,一種是msdos,一種是unix。msdos的ascII文件的換行處用0x0d 0x0a兩個ascII表示,但unix下用0x0a表示。VC的編譯器采用msdos方式的ascII文件,所以當他遇到unix的ascII文件格式時會向你報警。”
解決方法:
在VC6里編輯一下該文件,再保存時VC6就會修復該問題。
因解耦合可得到的好處是:1. 增加新的具體命令不影響其他的類;2. 可以把多個命令聚合在一起組成命令隊列。
Command模式的缺點:使用命令模式會導致某些系統有過多的具體命令類。
閱讀全文