4

是否可以在 c++ 中访问类的私有成员。

前提是您没有朋友功能并且您无权访问类定义

4

4 回答 4

8

您的意思是使用一些指针算法来获得访问权限?这是可能的,但绝对是危险的。也看看这个问题:Accessing private members

于 2009-04-08T10:23:31.720 回答
6

我认为有一些像这样的老派把戏:

#define private public
#include "header.h"
#define private private

但是您强烈建议不要这样做(我已经快速阅读了 C++ 标准中关于此的内容) - 如果您想了解更多关于“#define private public”的谷歌信息

于 2009-04-08T11:08:40.520 回答
2

好吧,我可能在胡说八道,但我认为您可以尝试定义一个“双胞胎”类,其成员与您要修改的类相同但具有不同的公共/私有修饰符,然后使用 reintepret_cast 将原始类转换为您所在的类可以访问私有成员。

它有点hacky ;-)

一些代码来解释这个想法:

class ClassWithNoAccess 
{
public:
  someMethod();

private:
  int someVar;
};

class ClassTwin 
{
public:
  someMethod();

public:
  int someVar;
}

在代码中的某处:

ClassWithNoAccess* noAccess = new ClassWithNoAccess();
ClassTwin* twin = reinterpret_cast<ClassTwin *>(noAccess);
twin->someVar = 1;

编辑:所以就像有人之前已经写过的那样,这可能有效,但标准不保证带有 public 和 private 修饰符的变量的顺序是相同的

于 2009-04-08T11:05:47.967 回答
2

即使通过一些令人讨厌的黑客攻击是可能的——请参阅之前的帖子——你不应该这样做。

封装是为了一个很好的目的而存在的,将类成员设置为私有意味着开发人员不打算让任何人搞乱该成员。这应该意味着

“您无需访问此成员即可完全使用公共接口”

于 2009-04-08T13:19:56.057 回答