有什么方法可以访问类的私有成员变量吗?

时间:2010-02-08 06:04:09

标签: c++

有什么方法可以访问类的私有成员变量吗?

编辑: 不是来自成员函数或朋友函数,而是来自实例。

9 个答案:

答案 0 :(得分:12)

GotW #76有关于如何做这些事情的迷人的语言法律细节。 : - )

答案 1 :(得分:5)

C ++的一个“肮脏技巧”是做类似的事情:

#define private public
#include "ClassHeader.h"

// now all the private members of the included class are public

强烈建议执行此操作。

答案 2 :(得分:5)

你可以:

  1. 将私人成员放在公共部分
  2. 让您的课程或职能成为班上的朋友。
  3. 提供数据访问者。
  4. 获取类的地址,将偏移量添加到该变量,强制转换和取消引用。 (呸)
  5. 你想做什么?如果某些东西是私人的,请不要乱用它。这是私人的原因。

答案 3 :(得分:5)

只需将其转换,转移内存并退回。 (没有编译代码,但你应该明白这一点。)

class Bla
{
public:
    Bla() : x(15), str("bla") {}
private:
    int x;
    std::string str;
}

int main()
{
    Bla bla;

    int x = *((int*)(&bla));
    std::string str = *((std::string*)((int*)(&bla) + 1));

    std::cout << x << str;

    return 0;
}

由于这是一个面试问题,我不会讨论为什么你不应该这样做。 :)

编辑: 具有虚函数的类也将在那里的某处具有虚拟表指针。我不确定是否&amp;将为您提供vt的地址或第一个数据成员的地址。

默认情况下对齐是4(对吗?),因此如果您正在阅读的成员没有对齐,请移动2个字节以进入下一个。

答案 4 :(得分:3)

是。您可以访问私人会员:

  • ...在相同(确切)类型的其他实例中。
  • ...在声明为该类的朋友的类或函数中。
  • ...通过公共访问者(getter / setter)成员函数。

答案 5 :(得分:2)

虽然我们提出了不好的想法,但代码端没有任何内容强制执行封装 - 它完全是一个编译器技巧 - 因此您可以编写程序集来直接访问私有成员。

但是为什么不是重写基类如果它没有做你想要的呢?

答案 6 :(得分:2)

你为什么要这样做?

可见性规则很明确:

  • 私有方法只能通过类
  • 的方法访问
  • 受保护的方法可以通过类或后代的方法访问
  • 任何人都可以访问公共方法

...因此 - 如果您自己编写课程,请选择正确的可见性。如果它是一个提供的类,那么小心的事情为什么它首先是私有的......

如果你决定违反该规则,你有几个选择:

  • 您可以通过friend说明符与应该访问私有方法的类成为朋友
  • 你可以使用一个丑陋的预处理程序黑客,可能已经有人发布了,但如果你需要使用字段或方法进行单元测试,那么 - 任何其他用途都是糟糕的设计< / LI>
  • 你可以使用一个丑陋的类型铸造黑客,但它太丑了,我甚至害怕发布它不会被投票;&gt;

答案 7 :(得分:0)

是,为什么不通过会员功能

答案 8 :(得分:0)

我认为这取决于问题的表达方式:

问:您如何访问私有成员变量? 答:我不会。

同时:

问:你将如何实施...... 答:我不会,已经完成了,我会利用现有的框架/库。

采访者并不总是想知道你是否可以制造一个轮子,有时候他们正在探究你是否知道如何找到最近的服务站。 :)