1. 程式人生 > >C++靜態成員函式訪問非靜態成員變數的方法

C++靜態成員函式訪問非靜態成員變數的方法

靜態成員函式不能訪問非靜態成員,這是因為靜態函式屬於類而不是屬於整個物件,靜態函式中的 member可能都沒有分配記憶體。靜態成員函式沒有隱含的this自變數。所以,它就無法訪問自己類的非靜態成員。但我們在一個class中要使用CreateThread,並且需要在這個開啟的執行緒中處理類的非靜態成員變數的時候,因為CreateThread需要入口函式的地址,因此要進入類的成員函式時要求這個類成員函式是static的。那我們需在類的靜態成員函式中訪問非靜態成員變數該怎麼辦呢?

一種方法是如下:

int menber;
//將上一行的非靜態成員變數改寫成下面所示的靜態成員變數:
static int menber;

這種方法要求我們把所有要訪問的成員變數都改成靜態的,這樣不僅不方便,而且會要求我們對類的靜態成員顯示初始化。有沒有更好的辦法呢?我們可以用給靜態成員函式傳遞類的指標的方法來解決這個問題。方法如下:


前提是這個類要分配了記憶體空間。其實這裡我做的就是將一個物件指標作為靜態成員函式的“this”指標,意在作為傳遞非靜態成員函式裡this變數使用(在非靜態成員函式中都有this指標(似乎push在ECX中))。這樣,我們呼叫了newThread()函式後,裡面新建的執行緒可以執行類的靜態成員函式,而且通過將本物件的指標傳遞到這個靜態成員函式裡,這個函式也可以通過本物件的指標訪問類的非靜態成員變數。

class a
{
public:
  static FunctionA(a* _a)
  {
    _a-> menber = 1;
 cout<<_a-> menber<<endl;
 _a->f();
  }
void f()
{
 cout<<"f被呼叫了"<<endl;
}
void newThread()
{
   HANDLE hnd=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)FunctionA,this,0,0);
}
private:
  int menber;
};

前提是這個類要分配了記憶體空間。其實這裡我做的就是將一個物件指標作為靜態成員函式的“this”指標,意在作為傳遞非靜態成員函式裡this變數使用(在非靜態成員函式中都有this指標(似乎push在ECX中))。這樣,我們呼叫了newThread()函式後,裡面新建的執行緒可以執行類的靜態成員函式,而且通過將本物件的指標傳遞到這個靜態成員函式裡,這個函式也可以通過本物件的指標訪問類的非靜態成員變數。

相關推薦

C++靜態成員函式訪問靜態成員變數方法

靜態成員函式不能訪問非靜態成員,這是因為靜態函式屬於類而不是屬於整個物件,靜態函式中的 member可能都沒有分配記憶體。靜態成員函式沒有隱含的this自變數。所以,它就無法訪問自己類的非靜態成員。但

C++ 靜態成員函式呼叫靜態成員函式方法

#include <stdio.h> #include <windows.h> class Class; typedef struct { Class *pClass; int x; int y; }ParaNode; class Cl

成員函式轉換成void (*)和靜態成員函式獲取靜態成員變數方法

很多第三方函式需要把函式轉換成void(*)型別,如libevent 1.4版本中的event_set函式: 如果要傳遞類成員函式給相應的函式我們應該怎樣處理呢? 僅僅傳遞類成員函式可以嗎? 不可以的!編譯的時候會遇到下面的錯誤: cannot convert DataWa

c++中,一個類中同名的const成員函式const成員函式為什麼可以構成過載

#include<iostream> using namespace std; class Test { public: Test(int v):data(v){} void print()//this指標的型別是Test * { cout<&

c++中,可以用類名直接訪問靜態成員函式

正規的C++語言標準目前(截止到C++14)應該還不支援這種呼叫方法。 目前微軟似乎在它的VC++中推行一種叫做C++/CLI的標準,有可能會支援這種呼叫,如果一定要用這種呼叫方法的話,還應該用VS2013嘗試編譯執行一下。 實際上,C++語言中類的靜態成員函式本身應該是所有這一類物件的集體所具有的行為,就

C++ 靜態成員函式 訪問成員變數 & 函式指標、函式指標陣列、函式指標陣列指標的使用 & 回撥函式的使用

靜態成員函式可以通過引用類物件訪問類成員變數;test.h#ifndef TEST_H #define TEST_H class Test { public: Test(); Tes

C++ 類的成員函式中的靜態區域性變數

class A { public: A(){} ~A(){} int GetStaticNum(); }; int A::GetStaticNum() { static int i = 0;//靜態區域性變數屬於該方法,與類的例項無關 i++; return i; } int

靜態內部類和訪問靜態成員變數

靜態內部類訪問包含它的外部類的非靜態成員變數時,可以通過new外部類().成員的方式訪問,這是因為靜態的只能訪問靜態的,因為他們在物件沒建立前就存在了。如果想訪問非靜態的則必須初始化該物件,因為只有初始化後物件在記憶體才存在(靜態的除外)

關於靜態程式碼塊、靜態程式碼塊、建構函式、普通成員函式的呼叫順序

import java.util.Scanner; public class HelloJava { static String name; static { System.out.println(name + "靜態程式碼塊"); } public HelloJava(Stri

mfc中靜態函式呼叫靜態成員

靜態函式中呼叫非靜態,首先要獲取到對話方塊指標,最簡單最不推薦的方法是定義個全域性變數儲存對話方塊指標,通用性最強的是把指標作為靜態函式的引數傳進來。取巧的方法,如果對話方塊是主對話方塊可以AfxGetApp->GetMainWnd獲取指標。如果靜態函式不是執行在主執行緒,不能直接呼叫Upda

為什麼靜態方法不能直接訪問靜態成員

static成員是在JVM的CLASSLOADER載入類的時候初始化的,而非static的成員是在建立物件,即new 操作的時候才初始化的;類載入的時候初始化static的成員,此時static 已經分配記憶體空間,所以可以訪問;非static的成員還沒有通過n

為什麼靜態方法不能直接訪問靜態成員

static成員是在JVM的CLASSLOADER載入類的時候初始化的,而非static的成員是在建立物件,即new 操作的時候才初始化的;類載入的時候初始化static的成員,此時static 已經分配記憶體空間,所以可以訪問;非static的成員還沒有通過new建立物件

C++ 類成員函式中的靜態變數的作用域

本來的一個想法是C++ 的類的成員函式是屬於這個類的,那麼這個類的成員函式中的靜態變數也是屬於這個類的。不過越想越感覺不對勁,於是寫了個測試程式碼,試了一下。還真不對,結果是類的成員函式中的靜態變數,他的作用域是這個成員函式,不管是不是這個類的同一個例項化物件,他們都共用

“全棧2019”Java第七十二章:靜態內部類訪問外部類成員

難度 初級 學習時間 10分鐘 適合人群 零基礎 開發語言 Java 開發環境 JDK v11 IntelliJ IDEA v2018.3 文章原文連結 “全棧2019”Java第七十二章:靜態內部類訪問外部類成員 下一章 “全棧2019”Java第七十三章:外部類裡多

Effective Java 3rd 條目24 靜態成員類優於靜態

巢狀類(nested class)是一個定義在另外一個類內部的類。巢狀類應該僅僅是為了服務外部類而存在。如果內嵌類在其他某些情形下有用,那麼他應該是一個頂層類。有四種巢狀類:靜態成員類(static member class)、非靜態成員類(nonstatic member class)、匿

Delphi函式詳解:全域性函式,內部函式,類的成員函式,類的靜態方法

1. Delphi中的全域性函式 //要點: 需要給其他單元呼叫, 必須在 interface 宣告, 但必須在 uses 區後面 unit Unit1; interface uses   Windows, Messages, SysUtils, Variants, Cla

C++友元函式訪問類的私有成員

#include <iostream>#include<cstring>using namespace std ;class Student{private:string  name;int age;int sore;public:Student(string name,int age

C++Static 靜態函式呼叫靜態函式

test.h class test : { public: test(void); ~test(void); public: //你的其他函式 ... ..

Java子類與父類中靜態程式碼塊、靜態程式碼塊、建構函式的執行順序一覽表

子類Child繼承父類Parent Child child=new Child(); 執行順序如下: ①父類靜態程式碼塊>>②子類靜態程式碼塊>>③父類非靜態程式碼塊>>④父類建構函式>>⑤子類非靜態程式碼塊>>⑥子類

JAVA 在外部類外部訪問內部類,靜態內部類和靜態內部類的區別

在外部類外部訪問非靜態類內部類: package a; class Wai{ class Nei{ int i=3; } } public class test{ public