以下代码来自有关C ++面试问题here的帖子。我从未听说过这种技术:)(尽管它是一种不错的技术:))。我的问题是:在什么情况下需要使用它?您经常在真实的生产/旧版代码中看到它吗?
问题:
实现一种方法,以获取任何给定的Something *对象的topSecretValue。该方法应该是跨平台兼容的,并且不依赖于sizeof(int,bool,string)。
class Something {
Something() {
topSecretValue = 42;
}
bool somePublicBool;
int somePublicInt;
std::string somePublicString;
private:
int topSecretValue;
};
答案:
创建另一个类,该类具有Something的所有成员相同的顺序,但是具有返回该值的附加公共方法。您的副本Something类应如下所示:
class SomethingReplica {
public:
int getTopSecretValue() { return topSecretValue; } // <-- new member function
bool somePublicBool;
int somePublicInt;
std::string somePublicString;
private:
int topSecretValue;
};
int main(int argc, const char * argv[]) {
Something a;
SomethingReplica* b = reinterpret_cast<SomethingReplica*>(&a);
std::cout << b->getTopSecretValue();
}
在最终产品中避免使用此类代码很重要,但是在处理旧版代码时,它还是一种好技术,因为它可用于从库类中提取中间计算值。 (注意:如果事实证明外部库的对齐方式与您的代码不匹配,则可以使用#pragma pack来解决。)
答案 0 :(得分:7)
您可以在没有reinterpret_cast
的情况下执行此操作。在下面的博客文章中概述了使用模板和朋友的技巧,以演示该技术:
Access to private members. That's easy!
这肯定比访问员的方法安全,因为它消除了重新创建类定义时的人为错误。不过,这种方法好吗?给定的问题具有一些难以置信的人为约束,这些约束很少应用于“真实”项目。如果这是一个C ++项目,并且您有权访问头文件,为什么不只添加一个getter?如果它不是C ++项目,那么为什么对interop类的定义如此受限?