2014-12-03 64 views
4

我想創建幾個類,這些類都是派生類從抽象類(讓我們叫它)BaseClass。在BaseClass中,我想操作靜態在派生類中聲明的變量(數組)。在C++中有一個聰明的方法讓編譯器知道靜態變量將在派生類中聲明嗎?或者,例如,我應該在我的派生類的構造函數中傳遞一個對基類構造的靜態變量的引用?這是我的想法:在基類中使用靜態數組的C++,在派生類中聲明

class BaseClass 
{ 
    std::vector<float> &vector; 

public: 
    BaseClass(std::vector<float> &dVector):vector(dVector){}; 

    void vectorOperation() 
    { 
     vector.doSomething(); 
    } 
    ...  
} 

class DerivedClass : public BaseClass 
{ 
    static std::vector<float> sVector; 
    DerivedClass():BaseClass(sVector){}; 
    ... 
} 

我的解決方案是否正確?有沒有更好的方法來做到這一點?

+2

Sry,剛纔注意到它是靜態的。我可以使用CRTP。 – WhozCraig 2014-12-03 21:52:32

+0

命名當然不是最好的選擇:'std :: vector &vector;'應該是s.th.像'std :: vector &vector_;'至少。 – 2014-12-03 21:53:33

+0

您的解決方案看起來簡單,優雅和高效,以達到您所描述的目的。 – Christophe 2014-12-03 22:04:26

回答

2

在BaseClass中我想操作派生類中聲明的靜態變量(數組)。

虛擬實例成員函數可以將工作委託給派生類中的重寫,這可以爲您執行訪問。在靜態上下文中沒有辦法做到這一點(雖然看起來不像你正在嘗試這樣做)。

例如,我應該在我的派生類的構造函數中傳遞一個對基類構造函數的靜態變量的引用嗎?

這也可以是一個解決方案。但是,派生類的所有實例都將訪問相同的靜態數據區域,並需要存儲對其的引用。

基於虛擬功能的解決方案並不需要額外的存儲空間爲載體的引用:

class BaseClass 
{ 
protected: 
    virtual std::vector<float>& vector() = 0; 

public: 
    void vectorOperation() 
    { 
     vector().doSomething(); 
    } 
    ...  
}; 

class DerivedClass : public BaseClass 
{ 
    static std::vector<float> sVector; 
protected: 
    std::vector<float>& vector() { return sVector; } 
    ... 
}; 
3

您可以使用CRTP模式,但我不相信這是比你有什麼更好的。

template <typename Derived> 
class BaseClass 
{ 
    std::vector<float> &vector; 

public: 
    BaseClass(): vector(Derived::getVector()){}; 

}; 

class DerivedClass : public BaseClass<DerivedClass> 
{ 
    public: 

    static std::vector<float>& getVector() 
    { 
     static std::vector<float> v; 
     return v; 
    } 

    DerivedClass() {}; 
}; 
+0

我不確定這會如何工作,因爲v是在getVector()方法中聲明的,而不是在類中聲明的。這樣的聲明是否會爲DerivedClass中的每個對象創建相同的向量? – Rames 2014-12-03 22:05:16

+0

是的。由於它是一個'static'成員變量,因此將只有其中一個。 – 2014-12-03 22:06:59

相關問題