访问私人数据成员?

时间:2015-12-29 23:18:50

标签: c++

以下是一些代码

class A {
  int i;
}

void main()
{
  A a;
}

是否有可能(可能是hackish)方式访问a::i中的main

编辑: a::i应该保密。

4 个答案:

答案 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: