2016-11-08 150 views
0

考慮派生A類和BaseB類的Base類。從BaseB導出C類。所有類都繼承非靜態變量「y」,但在BaseB和C類中,「y」具有相同的值。 我解決了這個情況用下面的代碼:將靜態變量分配給非靜態變量

class Base { 
    protected: 
     int y; 
    virtual void registerValue() 
     { 
     y = 5; 
     } 

}; 

class A : public Base { 
}; 

class BaseB : public Base { 
    protected: 
    static int x; 
     virtual void registerValue() 
     { 
      // Process x ... 
      y = x; 
     } 

}; 

class C : public BaseB { 

}; 

int BaseB::x = 3; 

int main() {} 

它的工作原理,但它是正確的靜態變量分配給非靜態變量這種情況?

+0

我不明白爲什麼它不會。它是對靜態變量*的分配,您必須注意(併發問題等) – Medinoc

+0

「所有類都繼承非靜態變量」y「,但在BaseB和C類中,」y「具有相同的價值「 - 好吧,它們都具有相同的Y值;除了有時您將其設置爲不同的值。即。如果你打電話給'B或C :: registerValue',你最終會改變A的值,這可能不是你想要的。 – UKMonkey

+0

UKMonkey考慮到A類用自己的成員y生成其他實例。 – Ruben

回答

2

從語言合法性的角度來看,這很好,但有點奇怪。

大概你不能讓Base::ystatic因爲這會干擾類A的行爲?

你只需要知道BaseB的實例都將共享相同的x,但可能有不同的值y。這是預期的行爲?

個人而言,我會考慮做void registerValue()純虛函數的基類,並期待所有派生類實現一個方法,包括其實施所有必要的存儲。也許這也需要基類功能virtual int getRegistedValue() = 0呢?

+0

是Bathsheba我無法使Base :: y靜態,因爲在A類的情況下,「y」變量是不同的。用靜態x確保x對於類BaseB和C是相同的,因此我們將在這些類中具有相同的y值 – Ruben

+0

對於實現並不需要實現virtual int getRegistedValue()= 0。 – Ruben