我試圖避免聲明枚舉或使用字符串。雖然這樣做的理由看起來可疑,但完整的解釋並不重要。使用成員變量的地址作爲ID
我的問題很簡單。我可以使用成員變量的地址作爲唯一ID嗎?
更具體地,要求是:
- 的ID將不必被序列化。
- ID將被保護成員 - 只能由擁有對象在內部使用(即使在相同的類實例之間也沒有ID的比較)。
- 子類需要訪問基類ID並可以添加它們的新ID。
所以第一個解決方案是這樣的:
class SomeClass
{
public:
int mBlacks;
void AddBlack(int aAge)
{
// Can &mBlacks be treated as a unique ID?
// Will this always work?
// Is void* the right type?
void *iId = &mBlacks;
// Do something with iId and aAge
// Like push a struct of both to a vector.
}
};
雖然第二溶液是這樣的:
class SomeClass
{
public:
static int const *GetBlacksId()
{
static const int dummy = 0;
return &dummy;
}
void AddBlack(int aAge)
{
// Do something with GetBlacksId and aAge
// Like push a struct of both to a vector.
}
};
我可以看到使用SomeClass對象本身的地址,如果它是不可覆蓋的。但爲什麼你想在課堂上做到這一點呢? –
只要您將複製構造函數和賦值運算符設爲私有,並且不要嘗試以任何方式對其進行序列化。在構造函數中增加一個簡單的靜態計數器將是更合理的選擇。 –
因爲這個類中的所有代碼都是由一個宏生成的(而一個類可以實現多個這個宏)。實現枚舉的添加會更加複雜,我更喜歡比較內存地址和字符串。 – Izhaki