【问题标题】:Mutator/Accessor methods for object variable declared in private在私有中声明的对象变量的 Mutator/Accessor 方法
【发布时间】:2017-03-31 11:56:47
【问题描述】:

我在一个类的私有中声明了几个对象变量:

private:
a a1;

这个重载的操作符原本是这个类的朋友,访问对象如下所示:

istream & operator >>( istream & input, class & m )
{
    input >> m.a1;
    return input;
 }
  ostream & operator <<( ostream & os, const class & m )
 {
     os << m.uni;


     return os;
 }

当操作员解除好友关系时,它不应再访问私有变量。

如何访问这两个对象?会是使用返回指向对象的指针的访问器/修改器方法吗?

编辑:更改了代码,以便更多地解释问题。

【问题讨论】:

  • 与使用公共访问器方法从任何其他非友元函数访问它们的方式相同。

标签: c++ object accessor private-members mutators


【解决方案1】:

使用任何方法设置a1b1 的值。

您不必直接读入私有变量,也可以将值读入一些临时变量,然后使用它们修改a1b1。或者创建一个全新的Results 并将其分配给m

【讨论】:

    【解决方案2】:

    整个访问器思想的重点是防止使用类的程序员做他不应该做的事情。该课程的作者没有预料到的事情。

    根据定义,私有函数不供“使用该类的每个人”使用。例如,这意味着诸如输入有效性检查之类的东西没有到位 - 因为调用私有函数的代码应该进行这些检查(这避免了多次检查相同的情况。但是如果每个人都有输入未经检查的结果的风险访问)。

    是的,您可以通过向问题抛出裸指针来绕过访问器。访问权限仅由编译器在编译时检查,它无法预测编译时哪个函数会位于“地址 XYZ”。

    但如果你甚至考虑它,你就走错了路。接线员没有成为朋友是有充分理由的。可能是因为他一直在做朋友不应该做的事情。 Friends 和 protected 是两个非常特殊的情况,你有一个私有的,但有一些选择的例外。

    你可以控制这两个类吗?如果是这样,您为什么要删除朋友状态?

    如果你无法控制:你做了什么来失去朋友状态?你为什么要如此长地通过裸指针彻底破坏类的正常工作?

    【讨论】:

    • 我可以访问和控制课程。这一点是封装背后的想法。所以只允许访问类中函数的私有数据。运算符旨在成为一个子例程,在传递到下一个类之前读取类中所需的值。
    • 朋友,受保护,内部(C#/.NET 的东西)。他们都只是“私人例外”。如果你同时写这两个类,你可以把它当作朋友。您可以考虑使操作员成为一个简单的静态函数。我对本机 C++ 访问器有点生疏,但我认为获取类实例作为参数的静态方法将能够访问私有成员。或者也许编写一个私有静态函数来完成这项工作。然后让接线员成为只打电话给它的朋友。
    猜你喜欢
    • 2013-03-29
    • 1970-01-01
    • 2016-04-24
    • 2011-08-02
    • 2018-11-12
    • 1970-01-01
    • 2017-04-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多