我可以添加到Aiden's response的唯一的事情是,您還應該考慮用RAII技術替換需要顯式初始化和終止的代碼。當我已經面臨着提供超過的API的外觀,我似乎總是碰上一類,看起來像:
struct ADVERTISER {
/* a bunch of members here */
};
void adv_Initialize(ADVERTISER *adv, /* a bunch of arguments */);
void adv_DoStuff(ADVERTISER *adv);
void adv_Terminate(ADVERTISER *adv);
我已經看到了這個包裹在一個C++類的方式如下:
namespace wrapper {
class Advertiser {
public:
Advertiser(): inited_(false) {}
void initialize(/* a bunch of arguments */) {
terminate();
adv_Initialize(&adv_, ...);
inited_ = true;
}
void doStuff() {
validate();
adv_DoStuff(&adv_);
}
void terminate() {
if (inited_) {
adv_Terminate(&adv_);
inited_ = false;
}
}
protected:
void validate() {
if (!inited_) {
throw std::runtime_error("instance is not valid");
}
}
private:
ADVERTISER adv_;
bool inited_;
};
}
問題是,Advertiser
類沒有真正使API更容易使用,甚至清潔恕我直言。如果遇到類似案例,然後:
- 使用完全參數的構造函數,以確保無效的情況下沒有在析構函數存在
- 清理所有資源
- 寫拷貝構造函數和賦值運算符,如果他們有意義或使他們私人,並沒有實施他們。
我的目標是確保我提供的任何API /創建/包裝都適用於我們現有的編碼風格。我也嘗試將API彎曲成比目前更多的OO風格。我已經看到了一些我稱爲的面向對象C,就像我上面介紹的一樣。如果你想讓它們真正適合C++,那麼就要真正面向對象並利用C++提供給你的優勢:
- 要小心地管理任何狀態變量。
- 如果複製等操作沒有意義,請隱藏它們。
- 如果有任何泄漏資源的可能性,然後找到一些方法來防止它發生(通常採用RAII幫助)。
- 限制使用構造函數創建實例以消除無效實例和其他邊界情況。
謝謝,不知怎的,增強了我的信心;) 我通常不會遇到任何速度或語義問題,但通常的代碼是不乾淨,我希望它是。但我想沒有其他方法,因爲我沒有第三方庫的來源。 – tr9sh 2009-06-15 01:13:54