作者loveme00835 (高髮箍)
看板C_and_CPP
標題Re: [問題] 如何在member function 中創造新物件
時間Thu Dec 29 03:43:23 2011
※ 引述《steve1012 (steve)》之銘言:
: 我想寫一個class
: 其中有一個member function 可以創造出一個新的物件
: 比如說我的class 叫作 Integer
: 我想寫一個member function 叫做 addInteger
: 可以創造出一個新的Integer物件,內容是我所指定的
: 這要怎麼辦到呢?
: 要是在member function 中declare的物件不是只能存活到meber function 結束為止?
: ---------------------------------------------------------------------------
: 想再問一個vector在class中使用的方法
: 我要怎麼讓一個function 回傳vector 呢?
: 並且我宣告一個member data 為vector的方式哪裡錯了
: 我爬過文 也用了member initializer 了
: 以下是連結
: http://codepad.org/bHMJOD7J 標頭檔
: http://codepad.org/wGTV9IiI CPP檔
我希望你還可以花點時間回來審視一下自己的原始碼
"假如我呼叫 minsertElement(101) 會發生什麼事?"
"會當掉, 因為我的程式只能處理 0~100 的數字"
再看看你的建構子:
IntegerSet::IntegerSet() :mInteger(
101) {
/*...*/ }
IntegerSet::IntegerSet(...) :mInteger(
101) {
/*...*/ }
表示其實用
普通的陣列就綽綽有餘了, 為了避免掉一些重複的程式
碼就變成這樣:
struct IntegerSet {
typedef bool value_type;
typedef size_t size_type;
static const size_type fixed_size =
101;
private: value_type contains[ fixed_size ];
};
資料成員之所以會叫成 contains 是一種把它當成成員函式的手段
, 像是初始化的程式碼:
for( size_type n = 0; n < fixed_size; ++n )
contains[ n ] =
false;
做聯集:
IntegerSet unions(
const IntegerSet & rhs ) {
IntegerSet result;
for( size_type n = 0; n < fixed_size; ++n ) {
result.contains[ n ] =
this->contains[ n ] | rhs.contains[ n ];
}
return result;
}
除了有成員函式可呼叫以外, 回傳值的方法跟 C 語言結構沒什麼
不同, 等到你的程式在執行的時候會依照使用者輸入來決定該儲存
多少數字, 再來考慮用 vector<T>, 否則就像拿武士刀來殺豬一樣
不切實際(而且為了讓它安全執行, 程式碼會比你想得還要複雜)
再來就是這種表格法不適用的情形:
集合元素過少, 這時候就需要
把集合元素真正存起來了, 像是呼叫 minsertElement(9)內部資料
結構就要真的把 9 存起來, 只是如此一來你在做聯集交集時就要
考慮時間複雜度的問題了, 再來提供你幾個關鍵字:
std::set<T>
std::set_union()
std::set_intersection()
其他還有像是 int 的值域問題都是你沒有檢查到的, 例如呼叫
mdeleteElement(-2)程式該怎麼辦? 不做任何事? 還是把參數型態
改成 unsigned int較好? 寫完不會讓你進步, 能發現問題即使
是屍體, 也會強別人很多.
--
★ ★ ★ ★
★ ★ ★ ███ ███ █ █▌█ ██◣ ███ ▋▋█ ★ ★ ★
█▂█ █▃█ █ ███ █▆█ █▄█ ███
★ ★ █ ◣ █ █ █ ▋██ █▆◤ ███ ███ ★ ★
Kim Jae Kyung Koh Woo Ri Cho Hyun Young Kim Ji Sook
φwindyhorse
No Eul Oh Seung A Jung Yoon Hye
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.121.197.115
※ 編輯: loveme00835 來自: 140.121.197.115 (12/29 03:48)
推 steve1012:卸卸您的指教 12/29 14:00
→ steve1012:不好意思因為是課本上規定要用vector來寫 12/29 14:01
→ steve1012:所以才會用vector 不然用陣列我就會寫了 12/29 14:01
→ steve1012:只能處理0~100也是課本上的規定 12/29 14:01
→ steve1012:布過還是謝謝大大的提醒 12/29 14:01
→ steve1012:謝謝你的這篇讓我獲益良多 12/29 14:02
→ steve1012:其實我還沒寫完code 這幾天完成後會好好研究一下 12/29 14:03