作者ric2k1 (Ric)
看板EE_DSnP
标题[情报] Functional Object (for HW1.2.p3b)
时间Fri Sep 30 14:01:35 2011
(几个礼拜後会教,但我想应该要先提示一下,大家比较知道怎麽写)
注意: 题目中的 Less, Greater 不是 functions, 而是 class 的名字哦!!
当你宣告一个 class Less, 然後 overload "()" 这个 operator 时,
你就可以把这个 class 的 object 当作是 functional object 来使用。
在进一步说明之前,请大家区分清楚底下 "()" 的意义:
class A
{
public:
A() { ... }
A(int i) { ... }
bool operator() () const { ... }
int operator() (int i) { ... }
};
int f(const A& a)
{
if (a()) // 把 a 当作是 functional object,然後呼叫 bool A::operator() ()
return a(10); // 把 a 当作是 functional object
else
return a(20); // 把 a 当作是 functional object
}
int main()
{
A a(10); // 呼叫 A's constructor
A a = A(10); // 也是呼叫 A's constructor,产生 object 之後 assign 给 a
if (a()) { ... } // 呼叫 bool A::operator() ()
if (A()) { ... } // Error!! 呼叫的是 A's constructor,
// 产生的 object 不能直接给 if 做判断!!
if (A()()) { ... } // OK, 先呼叫了 A's constructor, 再呼叫 operator()
int k = a(20); // 呼叫 int A::operator(int) ()
f(A()); // 呼叫 A's constructor,产生 object 之後传给 f() 当参数
// 这就是 functional object
f(A); // Error!! 不能只是传 class name!!
f(a()); // Error!! 要的是 const A&, 不是 bool!!
}
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 140.112.21.240
1F:推 djshen:谢谢老师的解释 刚刚应该是其他地方写错 所以传Less()才有 09/30 14:19
2F:→ djshen:问题 09/30 14:19
3F:→ ric2k1:对了,关於 inherit class, 要注意是否所有 functions 都有 09/30 15:03
4F:→ ric2k1:被定义。更精确地说,如果是 pure virtual function, 09/30 15:05
5F:→ ric2k1:则所有的 inherit classes 都要 implement 这个 functions 09/30 15:06
6F:推 gamerred:想问A a = A(10);的constructor呼叫是不是建立两个物件 09/30 18:36
7F:→ gamerred:再用memberwise assignment? 我的理解中implicit建构似乎 09/30 18:37
8F:→ gamerred:与用explicit呼叫效果只有微妙的差异 而不是在上面那种说 09/30 18:38
9F:→ gamerred:法 是这样吗? 09/30 18:38
10F:推 djshen:所以constructor会回传一个object没错吧? 以前计程一直强调 09/30 19:05
11F:→ djshen:写constructor不可以写回传型态 所以没思考到这点 09/30 19:05
12F:推 gamerred:回大钧:应该说是呼叫constructor建构新物件 09/30 23:04
13F:→ gamerred:而不是constructor回传新物件 这种说法比较正确吧 09/30 23:05
14F:→ ric2k1:回 gamerred:是的,严格来说 A a = A(10) 的确只是直接 10/01 00:10
15F:→ ric2k1:呼叫个 constructor A(10) 去 construct a, 并不会先产生个 10/01 00:12
16F:→ ric2k1:空的 a 再把 A(10) assign 过去。但我觉得这只是 compiler 10/01 00:13
17F:→ ric2k1:的 optimization, 观念上两种说法其实都合理,应该是没有 10/01 00:14
18F:→ ric2k1:太去在意 (写程式的时候) 10/01 00:15
19F:→ ric2k1:^-- 必要 10/01 00:15
20F:推 nfprzkuma:感谢老师的精确解说 以前计程没学过这东西 10/08 16:37