【问题标题】:How to access private members of a class directly?如何直接访问类的私有成员?
【发布时间】:2020-09-25 13:05:52
【问题描述】:

我有一个作业,有人问我如何访问一个类的私有成员并在 c++ 中修改它们。我搜索了一下,我发现我们可以使用类型转换和指针来完成它,我知道这是一个未定义的行为和它永远不应该被使用。我的问题是: 是否有可能在其他面向对象的语言(如 java 或 python)中做这样的事情?

【问题讨论】:

  • 您读过C++ programming 的书或C++ tutorialC++ reference 的网站吗?如果你这样做了,edit 你的问题请在你的问题中添加一些minimal reproducible example。 StackOverflow不是一个做我的功课网站。您的问题的答案是:
  • 阅读更多about Java 和关于Python。请随时通过电子邮件与我联系basile@starynkevitch.net,但请在此处提及您的问题的 URL
  • 为什么要教你打破编程中的隐私概念......?
  • @BasileStarynkevitch 是的,我正在学习 c++,我的问题不是关于它,我在问其他面向对象的语言,我搜索了很多,但我没有找到任何有用的东西我的问题。
  • 您还想到了哪些其他对象编程语言?你读过ObjVLisp object model 吗?或者关于Common Lisp Object System ?见Common Lisp HyperSpec

标签: c++ encapsulation


【解决方案1】:

C++ 编程语言有一个friend specifier。 Friend 函数可以看到它的朋友类的私有成员。但是更多的年轻语言不包括这种机制。因为该机制不适合面向对象的编程范式(用于封装)。

【讨论】:

  • 措辞错误。在 C++ 中,friend is a specifier 不是函数(如 assign in std::string 是)
  • 回复:“该机制对于面向对象的编程范式(用于封装)不正确”——这根本不是真的。 friend 声明尊重封装;从类定义中你可以找到所有可以访问私有成员的东西:成员函数、友元函数和友元类的成员函数。这就是封装。
【解决方案2】:

在 C++ 中,您可以编写一个成员函数,该函数可以访问和修改私有成员并将此类函数公开。这是 OOP 的常用方法。但是,当然,包括 C++ 在内的不同语言可能会提供 hax 以另一种方式修改受保护的成员。

class T {
public:
  int get() const {
    return _member;
  } 
  void set(int member) {
    _member = member;
  } 
protected:
  int _member;

};

知名黑客列表

您可以轻松访问 Python 中的任何成员。只需dir,无论您要破解什么。 Private members in Python

您可以使用模板 http://bloglitb.blogspot.com/2011/12/access-to-private-members-safer.html 破解 C++ 成员。它比使用指针安全得多。

您可以通过 Java https://docs.oracle.com/javase/tutorial/reflect/ 中的反射访问私有成员。

通常,任何允许您调试代码的语言都应该以某种方式显示受保护的变量。

【讨论】:

  • 没错,但我正在寻找别的东西,我发现了 c++ 的这个技巧:geeksforgeeks.org/…
  • @Askoldllvento 是否有可能在其他面向对象的语言中做这样的事情?
  • Fargol_sh,我在其他OOL中添加了一些类似的东西。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-22
  • 2010-11-21
  • 1970-01-01
  • 2013-01-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多