類的成員函式的實現,如何實現類的成員函式作為回撥函式

2022-02-09 03:56:04 字數 3713 閱讀 3270

1樓:匿名使用者

class string

;答案:

string::string(const char *str)else

string::~string()

2樓:匿名使用者

//以前寫的,差不多,個別名字不同

#ifndef mstring_h_h

#define mstring_h_h

#include

class mstring

;mstring::mstring()

mstring::mstring(char* c_str)

else

}mstring::mstring(mstring& s)

mstring::~mstring()

}int mstring::strlength(const char* c_str)

void mstring::strcopy(char* dest,const char*src)

char* mstring::getstr()const

int mstring::getlength()const

ostream& operator<<(ostream& out,mstring& s)

mstring& mstring::operator=(mstring& s)

return *this;

}mstring& mstring::operator=(const char* c_str)

mstring& mstring::operator+=(mstring& s)

mstring& mstring::operator+=(const char* c_str)

mstring mstring::operator+(mstring& s)

mstring mstring::operator+(const char* c_str)

char mstring::operator(int i)

else

return m_str[i];

}#endif

如何實現類的成員函式作為**函式

3樓:匿名使用者

原理如果試圖直接使用c++的成員函式作為**函式將發生錯誤,甚至編譯就不能通過。 其錯誤原因是普通的c++成員函式都隱含了乙個傳遞函式作為引數,亦即「this」指標,c++通過傳遞this指標給其成員函式從而實現

程式函式可以訪問c++的資料成員。這也可以理解為什麼c++類的多個例項可以共享成員函式卻-有不同的資料成員。由於this指標的作用,使得將乙個

call-back型的成員函式作為**函式安裝時就會因為隱含的this指標使得函式引數個數不匹配,從而導致**函式安裝失敗。

2. 解決方案

要解決這一問題的關鍵

就是不讓this指標起作用,通過採用以下兩種典型技術可以解決在c++中使用**函式所遇到的問題。這種方法具有通用性,適合於任何c++。

1).   不使用成員函式,為了訪問類的成員變數,可以使用友元操作符(friend),在c++中將該函式說明為類的友元即可。

2).使用靜態成員函式,靜態成員函式不使用this指標作為隱含引數,這樣就可以作為**函式了。靜態成員函式具有兩大特點:其一,可以在沒有類例項的情況下

使用;其二,只能訪問靜態成員變數和靜態成員函式,不能訪問非靜態成員變數和非靜態成員函式。由於在c++中使用類成員函式作為**函式的目的就是為了訪

問所有的成員變數和成員函式,如果做不到這一點將不具有實際意義。解決的辦法也很簡單,就是使用乙個靜態類指標作為類成員,通過在類建立時初始化該靜態指

針,如pthis=this,然後在**函式中通過該靜態指標就可以訪問所有成員變數和成員函式了。這種處理辦法適用於只有乙個類例項的情況,因為多個類

例項將共享靜態類成員和靜態成員函式,這就導致靜態指標指向最後建立的類例項。為了避免這種情況,可以使用**函式的乙個引數來傳遞this指標,從而實

現資料成員共享。這種方法稍稍麻煩,這裡就不再贅述。

3. 舉例

class test

; //因為callbackfun預設有乙個const test* 的指標

};typedef void (*fptr)(void);

void fun(fptr ptr)

void main(void)

4樓:惆怋斱

許多程式設計師都發現,利用mfc或者其它的c++應用編寫**函式是非常麻煩的,其根本原因是**函式是基於c程式設計的windows sdk的技術,不是針對c++的,程式設計師可以將乙個c函式直接作為**函式,但是如果試圖直接使用c++的成員函式作為**函式將發生錯誤,甚至編譯就不能通過。通過查詢資料發現,其錯誤是普通的c++成員函式都隱含了乙個傳遞函式作為引數,亦即「this」指標,c++通過傳遞乙個指向自身的指標給其成員函式從而實現程式函式可以訪問c++的資料成員。這也可以理解為什麼c++類的多個例項可以共享成員函式但是確有不同的資料成員。

由於this指標的作用,使得將乙個callback型的成員函式作為**函式安裝時就會因為隱含的this指標使得函式引數個數不匹配,從而導致**函式安裝失敗。要解決這一問題的關鍵就是不讓this指標起作用,通過採用以下兩種典型技術可以解決在c++中使用**函式所遇到的問題。這種方法具有通用性,適合於任何c++。

1). 不使用成員函式,直接使用普通c函式,為了實現在c函式中可以訪問類的成員變數,可以使用友元操作符(friend),在c++中將該c函式說明為類的友元即可。這種處理機制與普通的c程式設計中使用**函式一樣。

2). 使用靜態成員函式,靜態成員函式不使用this指標作為隱含引數,這樣就可以作為**函式了。靜態成員函式具有兩大特點:

其一,可以在沒有類例項的情況下使用;其二,只能訪問靜態成員變數和靜態成員函式,不能訪問非靜態成員變數和非靜態成員函式。由於在c++中使用類成員函式作為**函式的目的就是為了訪問所有的成員變數和成員函式,如果作不到這一點將不具有實際意義。解決的辦法也很簡單,就是使用乙個靜態類指標作為類成員,通過在類建立時初始化該靜態指標,如pthis=this,然後在**函式中通過該靜態指標就可以訪問所有成員變數和成員函式了。

這種處理辦法適用於只有乙個類例項的情況,因為多個類例項將共享靜態類成員和靜態成員函式,這就導致靜態指標指向最後建立的類例項。

如何定義和實現乙個類的成員函式為**函式?

定義類x、y、z,函式h(x*),滿足:類x有私有成員i,y的成員函式g(x*)是x的友元函式,實現對x的成員i加1,

5樓:匿名使用者

h(x*)中x*是 表示引數是個類x的指標

拷貝建構函式不都是用x&的嗎? 是,但1、h(x*)不是拷貝函式啊,2、也沒有說引數不可以用指標啊!

關於c++巢狀類成員函式的實現的問題

6樓:匿名使用者

如下:template

class a;

};template

typename a::b* a::b::test(void) // 這裡加上typename,表明a::b是乙個類版才可以。權

7樓:匿名使用者

class a

}void a::b::print()

如何實現javascriptjs類命名空間的寫法

在c 中有namespace概念,java中有package的概念,有了這 些概念之後,在系統的執行時,每乙個方法就會擁有唯一的訪問路徑 namsepace.class.object,這樣就可以避免由於object重名所導致的問題.由於javascript是一種解釋型語言,在javascript中,...

在Java介面A的實現類B中如何呼叫A中的變數

1.num有歧義 不表示哪一個num 2.會3.介面b的實現類c吧 因為介面中的變數都是public static 的,用b.num試試 1 介面中你寫實現在繼承類?繼承下來當然報錯 the field num is ambiguous 2 介面中的變數 1 會得到但是前提是隻繼承b不能中間加個a ...

在matlab中如何實現函式的抽樣

dyaddown。功能 對時間序列進行二元取樣,每隔一個元素提取一個元素,得到一個降取樣時間序列。格式 y dyaddown x,evenodd 當evenodd 0時,從x中第二個元素開始取樣 偶取樣 當evenodd 1時,從x中第一個元素開始取樣 奇取樣 2.y dyaddown x even...