2013-04-09 181 views
0

如何將靜態成員的範圍限制爲n個特定類?例如,如果我創建類A的a1對象和類A的a2對象,我希望這些對象(用A創建的a1,a2)對於它們的靜態成員可以具有不同的值,但對於它們的相應派生類也是如此。將靜態成員的範圍限制爲n個特定類

class A{ 
    public: 
      A(int member){ 
       A::mMember=member;} 
      void set(int member){ 
       A::mMember=member;} 
      int get(){ 
       return A::mMember;} 
     protected: 
      static int mMember; 
    }; 

    int A::mMember; 

    class B:public A{ 
    public: 
     B(int member):A(member){}; 
    }; 

    class C:public A{ 

     C(int member):A(member){}; 

    }; 

    int main() 
    { 

     A * a1= new A(1); 
     std::cout<<"a1: "<< a1->get()<<std::endl; 
     B * b1= new B(2); 
     std::cout<<"a1: "<< a1->get()<<std::endl; 

     // How to make a1 continue be a1=2 and a2 = 5. I mean how to limit a static member  
     //to only its derivated class 
     A * a2 = new A(5); 
     std::cout<<"a1: "<< a1->get()<<std::endl; 
     std::cout<<"a2: "<< a2->get()<<std::endl; 

    } 
+2

請寫一個正確的問題。不要把整個問題放在一大堆代碼中的單個評論中。 – 2013-04-09 15:57:39

+0

爲什麼你不使用非靜態成員變量? – 2013-04-09 16:08:42

+0

我在基類中有一個映射成員,當構造派生類時,派生類將相同的ID分配給映射,因爲它繼承該成員。 – user1310873 2013-04-09 16:13:13

回答

2

的靜態成員的全部意義在於,它是「一個到處」 [並非沒有限制,但讓我們忽略了這個問題的目的。

在您的示例代碼中,您似乎希望b1 = B(2)更改A值,但a2對於mMember具有新值。這不可能使用靜態成員。

對我來說,看起來你真正想要的是一個工廠函數,它知道你什麼時候需要一個新對象,什麼時候你不需要,並且在相關的構造函數中傳遞一個對這個對象的引用,或者某種存儲(通過A中的靜態成員函數)。

在第一種情況下,看起來有點像這樣:

class A 
{ 
    public: 
     A(int member, int &ref_member) : mref_member = ref_member 
     { 
      A::mMember=member; 
     } 
     void set(int member) 
     { 
      A::mMember=member; 
     } 
     int get(){ 
      return A::mMember; 
     } 
    protected: 
     static int mMember; 
}; 

int A::mMember; 

class B : public A 
{ 
    public: 
     B(int member, int &ref_member) : A(member,ref_member) 
     { 
     }; 
}; 


A* maker(int v, bool needs_new_ref, char type) 
{ 
    static int *ref = NULL; 
    if (needs_new_ref || !ref) 
    { 
     ref = new int; 
    } 
    switch(type) 
    { 
     case 'A': 
      return new A(v, ref); 
      break; 
     case 'B': 
      return new B(v, ref); 
      break; 
    } 
} 

第二種方案包括這樣的功能:

int& ref(int id) 
{ 
    static map<int, int> refs; 
    return refs[id]; 
} 

然後調用ref(id)當你需要的參考。你需要找出一種方法來爲這個生成「id」。

根據您想要達到的目標,可能有很多其他解決方案。我很確定你的問題是一個XY問題 - 你問的是如何去做Y,因爲你認爲這是實現X的正確方法。

+0

+1「*我很確定你的問題是一個XY問題*」。 – ildjarn 2013-04-19 01:35:54