我有一个类,它是表示底层对象保存实际数据的层次结构的基础:
class Data { };
class Item
{
public:
AItem(AItem *source = nullptr) : m_Data(source ? reinterpret_cast<qintptr>(source) : -reinterpret_cast<qintptr>(new Data)) {}
virtual ~AItem() { if(m_Data < 0) delete reinterpret_cast<AData*>(-m_Data); }
qintptr id() const { return m_Data; }
Data *data() const { return m_Data < 0 ? reinterpret_cast<AData*>(-m_Data) : reinterpret_cast<AItem*>(m_Data)->data(); }
private:
qintptr m_Data;
};
请注意,当没有&#34;来源&#34;在构造函数中设置我创建Data
的新对象,将其重新解释为整数,否定它,然后将其保存到m_Data。这是至关重要的,因为它是从Data
中的层次结构中获取data()
对象时使用的,当然也包括在析构函数中。
然而,这可能是一个危险的黑客,因为它依赖于reinterpret_cast<qintptr>(source)
和reinterpret_cast<qintptr>(new Data)
永远不会产生负整数。他们可以吗?
如果他们可以(我认为他们可以,但我找不到明确的答案)我将不得不添加布尔标志以检查该项是否是基础对象。
答案 0 :(得分:0)
QT 5 documentation表示qintptr
是qint32
或qint64
的typedef,后者又是signed int
或signed long long
的typedef
所以,是的,价值可能是负面的。你必须编写正确的代码而不是使用“sign bit as extra boolean flag”hack。