以下是一些代码
class A {
int i;
}
void main()
{
A a;
}
是否有可能(可能是hackish)方式访问a::i
中的main
?
编辑:
a::i
应该保密。
答案 0 :(得分:4)
*reinterpret_cast<int*>(&a) = 666;
这应该可以解决问题。
现在,从技术上讲,当类型不同时,你通过使用post reinterpret_cast变量来引起UB。但是,i
保证位于A
的开头,因为A
是POD。
如果有虚函数,这绝对不起作用,如果你有自定义构造函数,则无法保证。
你不应该做任何像这样的事情!
答案 1 :(得分:2)
我用于单元测试的非常 hackish方式是(警告:仅在成人监督下使用):
// In your unit test only
#define class struct
#define private public
将它放在一个仅用于单元测试的头文件中!
编辑:(感谢@Peter)仅使用它进行快速和脏测试 - 永远不要将其检入存储库!
答案 2 :(得分:1)
可以肯定这不会起作用,但它可能适用于大多数平台:
#include <iostream>
class A {
int i;
public:
A (int j) : i(j) { ; }
};
int awfulGetI(A const& a);
int main()
{
A a(3);
int j = awfulGetI(a);
std::cout << "a.i=" << j << std::endl;
}
// Ugly code that may or may not work here:
struct AA {
int i;
};
int awfulGetI(A const& a)
{
struct AA const* p = reinterpret_cast<AA const*>(&a);
return p->i;
}
答案 3 :(得分:0)
创建类时,通常要指出具有它们提供的封装(当然,您可能需要检索或改变其中的值)。总是有可能使用内存地址,如这里的几个答案所示,但你是否考虑在类中创建一个公共“getter”函数,它只返回变量的值(因为函数本身具有访问权限) ?
实施例
diff --git a/tools/linsched/tests/Makefile b/tools/linsched/tests/Makefile
index 91bb8eb..8074c93 100644
--- a/tools/linsched/tests/Makefile
+++ b/tools/linsched/tests/Makefile
@@ -33,7 +33,7 @@ TEST_DEPS := ${TESTS:%=%.d}
${TESTS}: ${OBJ_FILES} $$@.o
@echo CC TEST $@
@${LD_PERCPU} -o $@.percpu $^
- @${CC} ${LFLAGS} -o $@ $@.percpu -MMD
+ @${CC} -o $@ $@.percpu ${LFLAGS} -MMD
@rm $@.percpu
clean: