【问题标题】:Private getters and setters [closed]私有 getter 和 setter [关闭]
【发布时间】:2018-02-20 12:52:27
【问题描述】:

我还是 C++ 和 OOP 编程的新手,我只是想知道一些奇怪的事情。 我有一个班级,我们将其命名为Foo,其中有一些私人成员。 我的问题是:Foo 对象在其生命周期内不会“传递数据”给其他对象。他们接收数据,做事,并将新数据保存到文件中。这意味着,只有Foo 对象可以访问Foo 私有成员。 实现私有 getter 和 setter 有错吗? 还是我应该使用直接访问? 伪代码如下:

这样好吗?

class foo
{
  private:
    string a;
    string b;
    string c;
    void setA(string A){this->a=A;}
    string getA()const{return this->a;
    void setB(string B){this->b=B;}
    string getB()const{return this->b;
    void setC(string C){this->c=C;}
    string getC()const{return this->b;
  public:
    //many omitted methods//
    void Method(); //<-- this method does things and calls private getters and setters to modify private members
}

主要内容:

{
Foo obj=....;
obj.Method();
}

或者我应该:

class foo
{
  private:
    string a;
    string b;
    string c;
  public:
    //many omitted methods//
    void Method();
}

void foo::method()
{
    string s1;
    //initialize s1;
    this->a=s1; //operation example
    std::cout<<"A equals: "<< this->a;
}

不确定我是否以简单的方式解释了我的担忧。 提前感谢您的回复和帮助。

【问题讨论】:

  • 在某些时候,您必须编写访问成员本身的代码。我看不出推迟它的意义。我个人尽量避免使用 public getter 和 setter,因为它们会破坏封装。
  • 这更多的是见仁见智,因此并不适合这种格式。这是一篇讨论您的问题的好文章:quora.com/…
  • 我正在考虑实现直接访问:如果我说声明那些 getter 和 setter inline 将产生与直接访问相同的结果,我错了吗?
  • 我使用了私有的 setter/getter,但仅在非常有限的情况下更改值也需要发送值更改的事件。 setter 处理了这个额外的行为。否则,对于 C++,没有必要将成员变量视为某种 Java Bean 类型的值,更不用说私有 getter/setter。
  • @GiulioPaoli 这真的取决于编译器会发生什么。 inline 只会迫使编译器更积极地进行内联(通常它会取消最大函数体字节限制)

标签: c++ oop design-patterns software-design


【解决方案1】:

private“getters”和“setters”是没有意义的,除非你以某种有趣的方式利用多态性。

通过构造函数设置您的成员变量是最好的做法,并且将成员设置为const 可以防止无意修改。

无论其可访问性如何,都尽可能避免使用“setter”,因为它们只不过是规避封装而已。

【讨论】:

  • setter 对设置的验证没有用吗?
  • @GiulioPaoli - 类内部验证的目的是什么?
  • 我不会说私人二传手是无用的。假设每次分配给他们时都必须验证他们的成员字段。将此检查放在任何地方都是重复的,最好将其转移到私人或公共的二传手。然而,一个普通的 setter 是没有意义的。
  • 至于私人吸气剂。我想到了冗余的冗余办公室。
  • 我只允许 publicprotected 单个成员变量设置器断言。编写一个更改其他成员变量以恢复一致性的 setter 将是一种混淆练习。
【解决方案2】:

我不是最有经验的 C++ 开发人员,但从我的角度来看,使用直接访问并不是一个坏习惯,而且它需要更少的时间来编写。 另一方面,在你的接口中加入这样的成员就清楚地表明只有 Foo 对象可以读取 Foo 的私有成员,所以这两种方式都是可以接受的。

【讨论】:

  • 我就是这么想的。谢谢!
【解决方案3】:

拥有 getter 和 setter 的主要目的是以灵活和可扩展的方式控制对类成员的访问。如果你知道类的外部客户永远不会使用它们,那么你不会从创建 getter 和 setter 中得到任何东西,所以我建议根本不要编写它们。

它们只会弄乱您的源文件并使您的代码更难阅读。


通过他们的方式,您不需要每次想要访问成员时都使用this

class foo {
  private:
    string a;
    string b;
    string c;
  public:
    //many omitted methods//
    void Method();
}

void foo::method() {
    string s1;
    a=s1; 
    std::cout<<"A equals: "<< a;
}

【讨论】:

  • 我的教授总是教我每次都使用this关键字以避免歧义。顺便说一句,谢谢您的回复!
  • @GiulioPaoli:但没有歧义。告诉你的教授正确地学习语言,自然而然地比我更有技巧。
  • 我会的。先让我拿到学位。
  • @GiulioPaoli ;-) 然后放弃协作项目中没有理智的人使用的 2 字符缩进样式。
  • 啊哈哈,我通常不会这样缩进!不太关心缩进,因为这个问题很简单。我使用旧的讨厌但经常使用的表格缩进:D
猜你喜欢
  • 2014-03-27
  • 2011-04-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-22
  • 1970-01-01
相关资源
最近更新 更多