【问题标题】:How do you access private variables using public functions? [closed]如何使用公共函数访问私有变量? [关闭]
【发布时间】:2013-12-31 07:39:18
【问题描述】:

所以我不知道你们中的任何人是否曾经/上过 NewBoston.Com(顺便说一句,资源很好),但我正在看这个视频,老师说你如何使用 public 访问私人信息函数...

这是视频: http://www.youtube.com/watch?v=jTS7JTud1qQ

当然,直接跳到最后即可了解要点。

我不明白的是,您如何使用公共功能访问私人信息。如果您创建一个公开的函数,允许任何人设置名称并获取该名称,那么它不就是公开的吗?难道没有人能够弄乱我的代码和我想要的输出吗?

【问题讨论】:

    标签: c++ function methods private public


    【解决方案1】:

    提供公共方法来更改私有变量的关键在于您可以添加额外的控件。

    没有太大区别

    class A {
       public:
          int age;
    }
    

    和

    class B {
       private:
          int age;
       public:
          void setAge(int _age);
    }
    
    B::setAge(int _age) {
       this->age = _age;
    }
    

    但是,在第二种情况下,您可以添加拒绝某些数据(例如负值)或更新其他字段的逻辑。因此,您可以确保您的对象的数据将保持一致。如果您采用第一种方法,则每次直接访问属性时都应复制该逻辑(注意:许多程序员会忘记这样做)。

    【讨论】:

    • 我想我明白你的意思了。所以,我认为这是它的要点:您可以通过将预期的数据类型设置为私有来编辑生成的数据类型,因为您需要一致性。但是其他用户输入的数据本身应该是公开的,程序员只要能控制数据的类型和流向就可以了?我想你可以用这个类比:你想让一支笔有一个漏墨的地方,一个可以单击以弹出-不弹出(?)笔尖的按钮,一个框架,但确切的类型并不重要,只是需要的零件?如果你得到我。
    • 封装(隐藏内部细节)的好处之一是您可以有效地更改类/模块的实现细节而不影响(并且需要更改)其余代码,但它不是唯一的。例如,我的例子是关于保持一致的内部状态。
    【解决方案2】:

    在我看来,创建微不足道的 getter 和 setter(公共函数)有点徒劳。如果您的类功能完全由私有变量表示,那么微不足道的 getter 和 setter 是一种浪费,并且有点代码味道。也许您应该改用结构。

    但是,公共函数可以提供一个接口来指导类的使用并限制您可以对私有成员执行的操作。您不希望您班级的用户更改仅在同步步骤中更改时才有意义的单个私有成员。

    它还允许实现更改,而无需更改接口。例如,假设您想增加哈希映射的大小。伪代码:

    class IntHashMap {
    public:
    void increaseSize(int size);
    // Other stuff.
    
    private:
    int* backing_array_ ;
    int size_;
    }
    

    现在您对increaseSize() 的实现实际上可以检查新大小是否大于前一个大小。它实际上也可以创建一个新的 backing_array 并复制数据。公开私有变量 size 既不能检查 size 的正确值,也不能分配新的后备数组。

    【讨论】:

      【解决方案3】:

      抱歉,我没有看视频,但我假设您在谈论诸如 getter(获取属性值的函数 - 在本例中为私有数据成员)和 setter(设置这些值)。

      如果您将 getter 和 setter 作为纯传递函数提供,那么您是对的,这与将成员公开并没有太大区别。不过,通常的用途是为您的访问器函数提供智能——例如,让您对可以设置的值进行限制,或者让检索到的值被计算出来,而不仅仅是基于纯值。

      【讨论】:

        【解决方案4】:

        如果您无法从公共函数访问私有数据,那么您将只能从私有函数访问它,对吧。但是,从公共函数调用私有函数也应该被禁止,所以......

        您应该如何访问私人数据?

        【讨论】:

          【解决方案5】:

          如果你愿意的话,使用公共“getter/setter”的目的是,它们限制用户做的事情超出了你的期望。您可以通过将私有成员包装在公共访问器中来限制他们可以/不能做的事情,而不是让他们获取/设置私有成员(他们可以在其中做任何事情)。这样,在这个公共属性/函数中,您也可以限制他们可以设置的值。

          您也可以只让公共属性/函数获取私有成员,但阻止用户设置它。

          【讨论】:

            【解决方案6】:

            带有 getter/setter 的代码被认为比直接私有成员访问“更好”,因为这些函数可以控制来自这些变量的所有输入/输出,并确保它是类所期望的类型、范围或任何内容.这是类创建者在返回数据之前对正在设置或操作的数据进行错误检查的一种方式。

            如果你能做到 类.var = 值; 您可能会通过输入错误类型的变量,或超出某些限制,甚至输入一个合法值,而该类的代码中的某些逻辑会破坏这些值。对于单个开发人员的简单事情,这通常不是一个大问题,但对于实际的专业代码,将成员变量封装在 get/set 对中以进行访问/写入是非常好的做法。

            【讨论】:

            • 对于实际的专业代码,最好不要仅仅为了它而为每个数据成员编写 getter 和 setter。
            • 不。但这不是讨论这个问题的地方,所以我只会在 SO 上投反对票并将您发送给适当的问题。
            • 编译器无论如何都会对成员变量进行类型检查。这不是正当理由。
            • 你不经常使用指针是吗?当没有要检查的类型时,没有类型检查。仍然不确定我的答案与上面“赞成”的答案有何不同,后者说的大致相同。我什至从未暗示你必须封装任何东西,或者你应该为每个成员 var 做这件事。
            猜你喜欢
            • 2012-05-29
            • 2016-01-09
            • 1970-01-01
            • 2012-12-28
            • 2011-07-22
            • 2014-09-05
            • 2015-04-02
            • 2013-05-01
            • 2013-10-08
            相关资源
            最近更新 更多