推 legendmtg: 因為_Pred是已經建立的object 不是type 11/22 18:16
→ Feis: 當 a 是個物件時, a(b) 會試著呼叫 a.operator()(b) 11/22 18:19
→ Feis: 寫很多個 struct 有錯嗎? 11/22 18:19
推 legendmtg: 2看不太懂耶 什麼叫把functor全包起來 你是只想放在 11/22 18:24
→ legendmtg: 同個namespace下的意思 還是什麼.... 11/22 18:24
→ legendmtg: 不想寫很多個就想辦法做成template吧 11/22 18:24
推 LPH66: 我猜原 PO 第二點想要的大概就是 namespace 11/22 20:37
→ LPH66: 不過還是要原 PO 講一下他所謂的「很難管理」是什麼意思.. 11/22 20:38
先感謝以上各位的指教。
我的疑問是這樣的
1. 建立物件時會呼叫建構式, 如果建構式不只一個,
就看輸入引數的數目跟型別來判斷要呼叫哪一個。
那麼,當我建立FindSiteByID物件時,因為我傳入的引數是一個int,
所以呼叫了
FindSiteByID::FindSiteByID(int ID)
那麼根據F版友所述
→ Feis: 當 a 是個物件時, a(b) 會試著呼叫 a.operator()(b) 11/22 18:19
請問為何是會去呼叫
FindSiteByID::operator()(SiteInfo& info)
而不是去尋找看有沒有這個建構式來用
FindSiteByID::FindSiteByID(SiteInfo& info)
還是說這兩個是一樣的呢?我不懂的就是這一點。
FindSiteByID m_struct(1) -> 呼叫建構式
FindSiteByID m_struct(info) -> 呼叫operator()(SiteInfo& info) why??
2. 因為我的project裡面會對儲存SiteInfo的vector做一堆處理,
找出自己要的Site呼叫FindSiteByID只是其中一個。
我可能會寫
Struct InsertSite
{
std::vector<SiteInfo>& m_vector;
InsertSite(std::vector<SiteInfo>& site_vector)
{
m_vector = site_vector;
}
void operator()(SiteInfo& info)
{
m_vector.push_back(info);
}
}
然後搭配std::for_each把所有建立起來的SiteInfo一次塞完。
如果不同的功能每一個都寫成一個functor,可能有數十個。
那麼是否我應該寫一個新的class把這些functor全部包進去管理?
謝謝各位。
※ 編輯: Keitaro (114.43.194.55), 11/22/2014 21:37:46
※ 編輯: Keitaro (114.43.194.55), 11/22/2014 21:41:45
推 suhorng: 若 A 是個 type (例如 class A {...};), 那 A() 呼叫的就 11/22 21:58
→ suhorng: 是建構子; 若 A 是個變數(如 MyObj A;), 那 A() 呼叫的就 11/22 21:59
→ suhorng: 會是 A.operator()(...); 11/22 21:59
→ dirkc: 第二個問題是設計的大哉問,可能要看你會做的動作有哪些 11/22 22:30
→ dirkc: 我的淺見是需要先釐清設計的概念模型,先確定哪些物件以及 11/22 22:32
→ dirkc: 它們彼此間的關係,看狀況考慮用繼承或多型,template 或 11/22 22:33
→ dirkc: namespace 11/22 22:33
第一個問題我想明白了:
這一行
FindSiteByID(SiteNum)
相當於
FindSiteBy site(SiteNum)
建立物件暫時物件,呼叫建構式
FindSiteByID::FindSiteByID(int ID)
但是for_each的實作裡面這一行
if (_Pred(*_First))
其中的_Pred代表建構式建立起來的暫時物件,已經把物件建立完了,
此時塞SiteInfo進去,才會去呼叫
FindSiteByID::operator()(SiteInfo& info)
是不是這樣呢?
第二個問題我想試著先寫寫看,非常感謝以上指點的各位版友!
※ 編輯: Keitaro (114.43.215.48), 11/23/2014 13:49:14
推 LPH66: 差別就只是在這個名字到底是什麼東西而已 11/23 15:28
→ LPH66: FindSiteByID 是個 class 名所以是這種行為 11/23 15:30
→ LPH66: _Pred 是個變數名所以是那種行為, 而它的型態是模版參數_Pr 11/23 15:30
→ LPH66: 事實上在模版實現時代入 FindSiteByID 的正是這個 _Pr 11/23 15:31
→ LPH66: 而不是代入到 _Pred; 那玩意也無法代入就是個變數名而已 11/23 15:32