Pages

2010年12月31日 星期五

C++多重繼承

下面為C++多重繼承的網路經典範例。

//程序作者:管寧
//站點:www.cndev-lab.com
//所有稿件均有版權,如要轉載,請務必著名出處和作者

#include <iostream>
using namespace std;

class Vehicle {
public:
    Vehicle(int weight = 0) {
        Vehicle::weight = weight;
        cout << "載入Vehicle類構造函數" << endl;
    }
    void SetWeight(int weight) {
        cout << "重新設置重量" << endl;
 Vehicle::weight = weight;
    }
    virtual void ShowMe() = 0;
protected:
    int weight;
};

class Car: virtual public Vehicle//汽車,這裡是虛擬繼承
{
public:
    Car(int weight = 0, int aird = 0) : Vehicle(weight) {
        Car::aird = aird;
        cout << "載入Car類構造函數" << endl;
    }
    void ShowMe() {
        cout << "我是汽車!" << endl;
    }
protected:
    int aird;
};

class Boat: virtual public Vehicle//船,這裡是虛擬繼承
{
public:
    Boat(int weight = 0, float tonnage = 0) : Vehicle(weight) {
        Boat::tonnage = tonnage;
        cout << "載入Boat類構造函數" << endl;
    }
    void ShowMe() {
        cout << "我是船!" << endl;
    }
protected:
    float tonnage;
};



class AmphibianCar: public Car, public Boat//水陸兩用汽車,多重繼承的體現
{
public:
    AmphibianCar(int weight, int aird, float tonnage) : Vehicle(weight), Car(weight, aird), Boat(weight, tonnage)
    //多重繼承要注意調用基類構造函數
    {
        cout << "載入AmphibianCar類構造函數" << endl;
    }
    void ShowMe() {
        cout << "我是水陸兩用汽車!" << endl;
    }
    void ShowMembers() {
     cout << " 重量:" << weight << "頓," << "空氣排量:" << aird << "CC," << "排水量:" << tonnage << " 頓" << endl;
    }
};
int main() {
    AmphibianCar a(4, 200, 1.35f);
    a.ShowMe();
    a.ShowMembers();
    a.SetWeight(3);
    a.ShowMembers();
    system("pause");
    return 0;
}


載入Vehicle類構造函數
載入Car類構造函數
載入Boat類構造函數
載入AmphibianCar類構造函數
我是水陸兩用汽車!
 重量:4頓,空氣排量:200CC,排水量:1.35 頓
重新設置重量
 重量:3頓,空氣排量:200CC,排水量:1.35 頓
請按任意鍵繼續 . . . 
但是C++多重繼承有個問題是當繼承的方法或變數有相同的時候,到底要用哪種呢?

是否有方法可以直接指定要用哪個繼承的方法?

#include <iostream>
using namespace std;
class AA {
public:
    AA() {
    }
    void fat() {      
 printf("Addidas is Fat\n");
    }
};

class BB {
public:
    BB() {
    }
    void fat() {
 printf("Bill is Fat\n");
    }
};



class CC: public AA, public BB {
public:
    using AA::fat;
    CC() {

    }
};

class DD: public AA, public BB {
public:
    DD() {
    }
};

int main() {
    CC ca;
    printf("C is call..: ");
    ca.fat();
    DD da;
    printf("D is call..: \n");
    da.AA::fat();
    da.BB::fat();
    return 0;
}


C is call..: Addidas is Fat
D is call..: 
Addidas is Fat
Bill is Fat

由此可知,AA::fat() using AA::fat 皆可指定繼承的哪個方法會被使用。

Apache Tomcat Native library which allows optimal performance

利用用Eclipse 和tomcat 6.0,運行tomcat時候出現如下問題:
tomcat6.0
The Apache Tomcat Native library which allows optimal performance in
production environments was not found on the java.library.path

這是一個跟ARP有關的問題

APR(Apache
portable Run-time libraries,Apache可移植運行庫)
,
主要為上層的應用程序提供一個可以跨越多操作系統平台使用的底層支持接口庫。在早期Apache版本中,應用程序本身必須能夠處理各種具體操作系統平台的細節,並針對不同的平台調用不同的處理函數。隨著Apache的進一步開發,Apache組織決定將這些通用的函數獨立出來並發展成為一個新的項目。這樣,APR的開發就從Apache中獨立出來,Apache僅僅是使用APR而已。目前APR主要還是由Apache使用,不過由於APR的較好的移植性,因此一些需要進行移植的C程序也開始使用APR,開源項目比如Flood loadertester(http://httpd.apache.org/test /flood/,該項目用於服務器壓力測試,不僅僅適用於Apache)、FreeSwitch(www.freeswitch.org),JXTA-C(http://jxta-c.jxta.org,C版本的JXTA點對點平台實現);商業的項目則包括Blogline(http://www.bloglines.com/,covalent(http:
//www.covalent.net)等等。APR使得平台細節的處理進行下移。對於應用程序而言,它們根本就不需要考慮具體的平台,不管是Unix、Linux還是Window,應用程序執行的接口基本都是統一一致的。因此對於APR而言,可移植性和統一的上層接口是其考慮的一個重點。而APR最早的目的並不是如此,它最早只是希望將Apache中用到的所有代碼合併為一個通用的代碼庫,然而這不是一個正確的策略,因此後來APR改變了其目標。有的時候使用公共代碼並不是一件好事,比如如何將一個請求映射到線程或者進程是平台相關的,因此僅僅一個公共的代碼庫並不能完成這種區分。
APR的目標則是希望安全合併所有的能夠合併的代碼而不需要犧牲性能。APR的最早的一個目標就是為所有的平台(不是部分)提供一個公共的統一操作函數接口,這是一個非常了不起的目的,當然也是不現實的一個目標。我們不可能支持所有平台的所有特徵,因此APR目前只能為大多數平台提供所有的APR特性支持,包括Win32、OS/2、BeOS、Darwin、Linux等等。為了能夠實現這個目標,APR開發者必須為那些不能運行於所有平台的特性創建了一系列的特徵宏(FEATUREMACROS)以在各個平台之間區分這些特徵。


[解決辦法]
1. 到 [http://www.apache.org/dist/tomcat/tomcat-connectors/native/] 下載 [tcnative-1.dll]
2. 放到 [\TOMCAT_HOME\bin\] 下,重起eclipse 。

note: 放在 [windows\system32\下],應該也是可以。

2010年12月30日 星期四

【CMD】大量刪除指令

Windows下,[cmd]大量刪除指令  [delDir.bat]


@echo 移動到該磁區
c:
@echo 刪除資料夾下所有檔案(包含該資料夾本身)
rmdir C:\temp\source\ /s/y
@echo 建立資料夾
md C:\temp\source\

rmdir 指令參數 [rmdir [folder] /s /q
/s : 刪除指定目錄和所有子目錄,包括任何文件。.
/q : 刪除目錄無確認。
/? : 顯示幫助在命令提示。

【CMD】大量複製指令

Windows下,大量複製指令   [movefile.bat]

@echo 移動到該磁區
c:
@echo 移動磁碟中一個檔案
copy C:\temp\source\test.java C:\project\source\
@echo 移動磁碟中資料夾內所有檔案包含樹狀結構(子資料夾下的檔案)
xcopy C:\temp\source\ C:\project\source\ /s/y
@echo 暫停指令
pause

/S 複製每個目錄及其包含的子目錄。
/D 複製發生變更的檔案。
/Y 所有覆蓋的詢問都回答 YES

完整的
參數內容(從xcopy /?得知):

XCOPY source [destination] [/A | /M] [/D[:date]] [/P] [/S [/E]] [/V] [/W] [/C] [/I] [/Q] [/F] [/L] [/G] [/H] [/R] [/T] [/U] [/K] [/N] [/O] [/X] [/Y] [/-Y] [/Z]\r\r [/EXCLUDE:file1[+file2][+file3]...]

source 指定要複製的檔案。
destination 指定位置或者/以及新檔案的名稱。


/A 只複製設定成保存屬性的檔案,不要改變屬性的設定。
/M 只複製設定成保存屬性的檔案,並清除保存屬性。
/D:m-d-y 複製在指定日期當天或之後發生變更的檔案。如果沒有給日期,
只複製那些來源檔案日期比目的檔案日期為新的檔案。
/EXCLUDE:file1[+file2][+file3]...
指定檔案清單字串。每個字串
應該在檔案中的不同行。如果有字串對應到要進行複製的檔案絕

對路徑的任何部分,這個檔案會被排除複製。例如,指定字串\obj\ 或 .obj 的話,會排除所有在 obj 目錄下副檔名是.obj 的檔案複製。
/P 在建立每個目的檔案時顯示提示。
/S 複製每個目錄及其包含的子目錄,不複製空目錄。
/E 複製每個目錄及其包含的子目錄,也複製空目錄。/S 與 /E相同,能夠用來修改 /T。
/V 驗證每個新檔案。
/W 在複製之前提示您按鍵繼續。
/C 如果錯誤發生時也繼續複製。
/I 如果目的不存在且複製一個以上的檔案的話,就假設指定的目的一定是目錄。
/Q 在複製時不要顯示檔名。
/F 在複製時顯示來源及目的檔案的全部檔名。
/L 顯示要複製的檔案。
/G 允許加密檔案複製到不支援加密的目的地。
/H 時複製隱藏檔和系統檔。
/R 覆蓋唯讀檔案。
/T 建立目錄結構,但不複製其中的檔案。不包括空目錄及子目錄。
/T /E 會包括空目錄及子目錄。
/U 只複製已經存在目的位置的檔案。
/K 複製檔案屬性。通常 Xcopy 會重設唯讀的屬性。
/N 用所產生的短檔名來進行複製。
/O 複製檔案所有權及 ACL 資訊。
/X 複製檔案審查設定 (包含 /O)。
/Y 不要提示您確認是否要覆蓋一個已經存在的檔案。
/-Y 示您確認是否要覆蓋一個已經存在的檔案。
/Z 在可重新開始的模式中複製網路檔案。

參數 /Y 可以在 COPYCMD 環境變數中預先設定。但可以在命令列中用 /-Y 參數
來覆蓋原有設定。