re: 函數指針實例 夢在天涯 2008-05-23 14:14
another samples:
#include "stdafx.h"
class Object;
typedef int (Object::*MemFuncPtr)(int, int);
typedef int (*StaticMemFuncPtr)(int, int);
class Object
{
public:
// non-static member
int Add(int iFirst, int iSecond)
{
return iFirst + iSecond;
}
// static member
static int Sub(int iFirst, int iSecond)
{
return iFirst - iSecond;
}
//
typedef int (Object::*InClassMemFuncPtr)(int, int);
typedef int (*InClassStaticMemFuncPtr)(int, int);
};
int _tmain(int argc, _TCHAR* argv[])
{
// Test non-static Add
//
MemFuncPtr pfnMemFunc = &Object::Add;
// Need to bind the member function to a instance (need a this pointer)
Object test;
int res = (test.*pfnMemFunc)(1, 3);
// function call missing argument list; use '&Object::Add' to create a pointer to member
//MemFuncPtr pfnMemFunc1 = test.Add;
//res = (test.*pfnMemFunc1)(1, 3);
Object::InClassMemFuncPtr pfnMemFunc2 = &Object::Add;
res = (test.*pfnMemFunc2)(1, 3);
// Test Static Sub
//
// cannot convert from 'int (__cdecl *)(int,int)' to 'MemFuncPtr'
// Object::Sub Calling convention is __cdecl, but Object::*MemFuncPtr should be thisCall
// function signature include calling convention, parameter list and return value..
//pfnMemFunc = Object::Sub;
//res = (test.*pfnMemFunc)(1, 3);
StaticMemFuncPtr pfnStaticMemFunc = Object::Sub;
res = (*pfnStaticMemFunc)(1, 3);
StaticMemFuncPtr pfnStaticMemFunc1 = &Object::Sub;
res = (*pfnStaticMemFunc1)(1, 3);
Object::InClassStaticMemFuncPtr pfnStaticMemFunc2 = &Object::Sub;
res = (*pfnStaticMemFunc2)(1, 3);
// stl ? how to use this “function pointer”???
//std::mem_fun<int, Object>(&Object::Add);
//std::mem_fun<int, Object>(&Object::Sub);
return 0;
}
re: 函數指針實例 夢在天涯 2008-05-23 12:33
成員函數指針:
#include "stdafx.h"
class CMemFuncPtr;
typedef int (CMemFuncPtr::*MemFuncPtr)(int, int);
class CMemFuncPtr
{
public:
int Add(int iFirst, int iSecond)
{
return iFirst + iSecond;
}
};
int _tmain(int argc, _TCHAR* argv[])
{
MemFuncPtr pfnMemFunc = &CMemFuncPtr::Add;
CMemFuncPtr test;
(test.*pfnMemFunc)(1, 3);
return 0;
}
re: C++拷貝構造函數的幾個細節 夢在天涯 2008-05-12 09:00
@張某某
就想一般的函數重載一樣啊,你沒有重載那個版本的,你就不能用哦!
haha,這個targetver.h只有在08才有的把!
re: 談談C/C++和.NET以后的走向 夢在天涯 2008-04-28 09:12
haha,現在的工作用C+++C#,覺得這連個可以了應該吃飯沒有問題把!
因為result編譯器不知道是static變量還是類型,所以必須要typename來申明是類型!
re: 內存池(version1.1) 夢在天涯 2008-04-22 09:17
Modern C++ design有點高深哦!共同研究,共同進步哦!非常感謝分享!
還有可以通過CLI的封裝,可以看我的blog上有些資料啊!
re: C++、VC-迷茫 夢在天涯 2008-04-16 15:01
看工作需要了,不過據統計現在用java的最多啊,但是學的人多了,工資不一定是最高的哦!
re: 如何閱讀、使用Blog? 夢在天涯 2008-04-16 09:14
我現在用www.inezha.com也很方便!
沒有更新會自動發到我的msn上,一點就搞定可!
re: 單元測試PPT講義 夢在天涯 2008-04-09 09:19
修改代碼的藝術,確實是藝術!
單元測試,難的是正真的在項目中實行!
一直沒有編過,今天看lz說的這么仔細,太好了,以后有機會一定一試啊!
re: 猜猜看,id變成9了嗎? 夢在天涯 2008-04-02 10:02
((TestStr)(*p_ts)).SetId(9); //編譯通過
((TestStr)(*p_ts)).id = 9; //編譯不通過
(&((TestStr)(*p_ts)))->id = 9; //編譯通過
我在VS2005下:
正如作者所說中間的是編不過的,error,說是l-value不能賦值。
但是能編過的2個結果都還是1,沒有修改了原來的值,因為在類型轉化的時候都調用了拷貝構造函數,從新生成一個對象你修改的是拷貝后的臨時對象。(你可以寫拷貝構造函數測試一下)
所以同意:
這其實相當于調用了TestStr(const TestStr&)生成了一個TestStr&的臨時變量。
C++標準規定,類性轉換表達式的目標類型為引用時,結果為l-value;否則為r-value。
可能是寫的過程中有錯,所以你要flash一下io或重設io的狀態!
functor 確實是比STL中的一大堆好用多了!統一!
re: GCC4.3... 夢在天涯 2008-03-14 11:42
GCC4.3中帶有c++ox嗎,那我也下個啊,vs的話要等到vs2008了
re: 賣書 夢在天涯 2008-02-18 17:09
我也有一個C#primer 和C#設計模式,有誰要的話也聯系我啊!我的2本都半價。
re: 好又多刷卡奇遇記 夢在天涯 2008-02-03 11:05
那最后確定了嗎,真的是多刷了嗎,真可怕啊!
所以以后刷卡呀一定要在旁邊看著啊!