2014-12-19 169 views
0

靜態函數的問題在於它僅接受靜態類變量和函數。解決方法是可能的。從C++中的靜態方法訪問非靜態類變量

Class A{ 
int x; 
static void function() 
{ 
    A *a= new A(); 
    a->x; //this way we can access the non-static functions 
    free(a); 
    } 
} 

但讓我們假設這種情況在隊列中。

Class A{ 
queue x; 
static void function1() 
{ 
    A *a= new A(); 
    a->x.push(some argument); //this way we can access the non-static functions 
    free(a); 
} 

static void function2() 
{ 
    A *a= new A(); 
    a->x.pop(); //this way we can access the non-static functions 
    free(a); 
} 

}

每個功能1和功能2將創建自己的實例即隊列,這意味着隊列x是兩者的功能不同。

我們怎樣才能讓兩個函數都可以訪問同一個隊列,而不是使它變爲靜態的,請問有沒有辦法解決,請注意function1()和function2()在線程中並行運行。因此function1()是獨立於function2()的,反之亦然。

+2

爲什麼沒有達到靜態要求?或者,爲什麼'functdion1'和'function2'需要是靜態的? – 2014-12-19 05:21:03

+0

我不知道靜態要求,但我被告知。函數1和函數2需要是靜態的,因爲它們是在單獨的.h和.cpp實現中通過pthread_create函數傳遞的。 – Kamran 2014-12-19 05:32:38

+2

除了被問及回答的實際問題之外,你真的不應該把'a = new A()'與'free(a)'混合在一起。如果你有新東西,請刪除它。如果你'malloc()'有東西,'free()'它。 – etheranger 2014-12-19 05:34:40

回答

1

我認爲你需要首先檢查你的設計爲什麼你需要這個。

順便說一句,您可以將隊列作爲參數傳遞給函數。這將允許function1function2訪問相同的隊列。但是,因爲它們並行,您可能需要鎖定機制。 但是在調用function1/function2之前必須創建隊列,他們不應該釋放它。

static void function1(A *a) 
{ 
    a->x.push(some argument); //this way we can access the non-static functions 
} 

static void function2(A *a) 
{ 
    a->x.pop(); //this way we can access the non-static functions 
} 

我也覺得這種方式不是一種解決方法,但一個乾淨的解決方案。

+0

實際上,程序將以串行方式工作而不是並行方式,但我想這似乎是唯一的解決方案。謝謝! – Kamran 2014-12-19 05:30:41

+0

當我這樣做pthread_create()參數期望function1(void *),並給出轉換錯誤,任何想法? – Kamran 2014-12-19 05:48:09

+0

你可以將'void *'轉換爲'A *'。 – doptimusprime 2014-12-19 05:55:00