2012-10-29 69 views
2

我有一個類有一個靜態指針指向另一個類,它是一個單例。我似乎得到的問題是,我不能從所述類的構造函數中設置指針。這是我現在的代碼:在另一個類中定義靜態類指針

class B; 

class A 
{ 
    public: 
    A(); 
    ~A(); 
}; 


class B 
{ 
    public: 

    B(); 
    ~B(); 

    static A* a; 
}; 

A::A() { 
    A* B::a = this; 
} 

現在,我似乎得到的問題是,我不能在「當前範圍」中定義B :: a。另外,「this」指針只能用於「非靜態成員函數」中。

我認爲問題與在另一個類函數中定義靜態類變量有關,但我不確定。

+0

所以你想要一個靜態成員,可以在實例化類之前使用,直到另一個類被實例化時才能被定義。 – chris

+0

你在問什麼?我不確定你的意思。 – user1703993

+0

既然'B :: a'是公共的(除了是靜態的),你可以在'A'的構造函數中做'B :: a = this;'。但效果是1)'B :: a'不會被初始化,直到創建'A'的第一個實例,並且2)每次創建一個新的'A'實例,'B :: a '會改變。你確定這是你想要的嗎?這聽起來非常不尋常。 – jogojapan

回答

0

你應該定義所有靜態成員類的聲明外:

class B; 
class A 
{ 
public: 
    A(); 
    ~A(); 
}; 


class B 
{ 
public: 

    B(); 
    ~B(); 

    static A* a; 
}; 

A* B::a; // HERE 

A::A() 
{ 
    B::a = this; // and there was an error here too 
} 

不要忘記定義其他構建函數/ dtors。

+0

我認爲你的意思是定義,而不是聲明。 – 2012-10-29 03:45:34

+0

@Grigory:的確如此! –

2

首先,靜態類成員必須定義以及聲明。 static A* a;在B類正文中僅僅是一個聲明,而你需要定義爲 a。請注意,每個類成員都必須有一個單一的定義,這就是爲什麼我們通常在適當的類文件中定義靜態成員的原因。顯然,這發生在班級體外。您也不能在函數的作用域中定義一個靜態成員。

因此,移動構造函數的範圍的以外的定義是這樣的:

class B 
{ 
public: 

    B(); 
    ~B(); 

    static A* a;}; 

A* B::a = 0; // Good idea to set a default value for the pointer 

但是請注意,是的a值將包含一個0,直到創建A型的至少一個對象。

+0

好的,我明白了。我不知道你必須定義兩次靜態變量。 – user1703993

+0

請注意,您實際上*只定義一個靜態變量一次。這個問題的答案http://stackoverflow.com/questions/1410563/what-is-the-difference-between-a-definition-and-a-claclaration將幫助你更好地理解聲明和定義之間的區別:) – 2012-10-29 03:53:27