好像答案是問題 - 你建議的方法似乎是朝着正確的方向走,但如果你有這些共享成員的一個大數目,你可能希望將它們收集到一個結構或類並將其作爲基類構造函數的參數。
如果你堅持具有「共享」成員實施的派生類的靜態成員,您也許能自動生成派生類的代碼。 XSLT是自動生成簡單類的好工具。
一般來說,這個例子並不需要「虛擬靜態」成員,因爲對於這樣的目的,你實際上並不需要繼承 - 相反,你應該使用基類並讓它接受適當的值構造函數 - 可能爲每個「子類型」創建參數的單個實例,並將指針傳遞給它以避免共享數據的重複。另一種類似的方法是使用模板並將作爲模板參數的類傳遞給提供所有相關值的類(這通常稱爲「策略」模式)。
要總結 - 在原來的例子的目的,沒有必要對這種「虛靜態」的成員。如果您仍然認爲您正在編寫的代碼需要它們,請嘗試詳細說明並添加更多上下文。什麼上述我
例子:
class BaseClass {
public:
BaseClass(const Descriptor& desc) : _desc(desc) {}
string GetName() const { return _desc.name; }
int GetId() const { return _desc.Id; }
X GetX() connst { return _desc.X; }
virtual void UseClass() = 0;
private:
const Descriptor _desc;
};
class DerivedClass : public BaseClass {
public:
DerivedClass() : BaseClass(Descriptor("abc", 1,...)) {}
virtual void UseClass() { /* do something */ }
};
class DerDerClass : public BaseClass {
public:
DerivedClass() : BaseClass("Wowzer", 843,...) {}
virtual void UseClass() { /* do something */ }
};
我想闡述一下這個解決方案,並可能給出一個解決方案,去初始化問題:
一個小的改變,你可以實現上述設計,而不必爲派生類的每個實例創建一個「描述符」的新實例。
您可以創建一個單獨的對象,DescriptorMap,將舉行各描述符的單個實例,並構建派生的對象,像這樣的時候使用它:
enum InstanceType {
Yellow,
Big,
BananaHammoc
}
class DescriptorsMap{
public:
static Descriptor* GetDescriptor(InstanceType type) {
if (_instance.Get() == null) {
_instance.reset(new DescriptorsMap());
}
return _instance.Get()-> _descriptors[type];
}
private:
DescriptorsMap() {
descriptors[Yellow] = new Descriptor("Yellow", 42, ...);
descriptors[Big] = new Descriptor("InJapan", 17, ...)
...
}
~DescriptorsMap() {
/*Delete all the descriptors from the map*/
}
static autoptr<DescriptorsMap> _instance;
map<InstanceType, Descriptor*> _descriptors;
}
現在我們可以做到這一點:
class DerivedClass : public BaseClass {
public:
DerivedClass() : BaseClass(DescriptorsMap.GetDescriptor(InstanceType.BananaHammoc)) {}
virtual void UseClass() { /* do something */ }
};
class DerDerClass : public BaseClass {
public:
DerivedClass() : BaseClass(DescriptorsMap.GetDescriptor(InstanceType.Yellow)) {}
virtual void UseClass() { /* do something */ }
};
在執行結束時,當C運行時執行uninitializations,它也叫靜態的物體,包括我們的autoptr,這在我們刪除的DescriptorsMap的實例的析構函數。
所以,現在我們有也正在在執行結束時刪除每個描述符的一個實例。請注意,如果派生類的唯一目的是提供相關的「描述符」數據(即與實現虛函數相反),那麼您應該使基類非抽象化,並創建一個每次都有適當的描述符。