void* GetData()
{
return reinterpret_cast<unsigned char*>(this);
}
在这种情况下是否会发生自动类型强制的情况???我怎么能将我的类的对象转换为unsigned char * ??
答案 0 :(得分:6)
我假设你引用了return reinterpret_cast<unsigned char*>(this);
这是一个令人讨厌的大块,可能采取了错误的方法来解决错误的问题。从技术上讲,它要求编译器将this
指针的类型重新解释为unsigned char*
指针。这里没有做任何工作:该语句仅指示编译器将指针视为不同类型。如果将类型解释为错误,这是灾难性的。
如果您希望按位检查对象,那么您可以尝试这样的事情:
union inspect_klass {
klass obj;
char bits[sizeof(klass)];
};
编辑:我对上述工会的信心现在已经动摇了。不要使用它,我正在寻找确认这个技巧确实被打破的确认。 :■
答案 1 :(得分:1)
我同意其他帖子:这几乎肯定不是你打算做的。
然而,IIRC,您可以通过C ++标准保证能够将任何类型的指针(不包括函数或成员指针)转换为unsigned char *
或{{ 1}}然后返回未进入未定义行为的领域。此外,您可以通过类型为void *
或char *
的左值访问任何对象(请参阅ISO 14882:2003第3.10.15节)。之前我已经使用过它来检查任意对象类型的内部表示。如果我对标准的阅读是正确的,那么在“实现定义的行为”中(显然,类型的内部表示取决于实现)。
例如,
unsigned char *
是一个模板函数,它将产生一个template<class T> std::vector<unsigned char> to_bytes (const T& t)
{
const unsigned char *p = reinterpret_cast<const unsigned char *>(&t);
return std::vector<unsigned char>(p, p + sizeof(T));
}
,它是对象内部表示的副本。
但是,当你回来时,你被投射到std::vector<unsigned_char>
这一事实让我怀疑你做的事情可能更令人讨厌而且更加未定义。
答案 2 :(得分:0)
首先,您的GetData()返回类型与表达式的返回类型不匹配。
reinterpret_cast类似于旧的旧式C cast - 你只是返回一个指向unsigned char *的指针。这完全不安全。实际上,您正在创建一个类的数据视图,可以按字节访问。
答案 3 :(得分:0)
严格地说,unsigned char *是一个字节数组。如果调用者要序列化数据,这似乎是完全合乎逻辑的事情。