【问题标题】:How to achieve encapsulation in C++ with getter methodC++中如何用getter方法实现封装
【发布时间】:2018-09-05 06:03:42
【问题描述】:

在下面的代码中,我将值从另一个类函数分配给 url。 我收到了代码审查评论“将 url 设为私有并且 实现 getter 函数,它应该返回 std::string 通过引用传递的输出参数的值'

class http_client
{
    public:
        std::string url;
};

我对上面的评论感到困惑,因为我只使用 url 来设置 http_client 类之外的值。最初,我认为我必须制作 一种公共 setter 方法,它将值设置为 url,如下所示。

class http_client
{
    private:
        std::string url;
    public:
        void set_url(const std::string& url)
        {
            this->url = url;
        }
};

谁能建议我在上面的代码审查评论中缺少什么?

【问题讨论】:

  • 您的审阅者似乎是 Java bean 的粉丝
  • 只有当url 只保存数据而没有任何副作用时,封装才会产生开销。 (即使在这种情况下,封装也可能是一种独特风格的问题。)通常情况下,成员大多具有副作用。因此,它们通常被设为private ,并且 setter(更改成员的专有方法)负责在成员更改时授予此副作用。现在,getter 是访问(读取)成员所必需的。设为inline,通过函数访问不会导致(优化)代码开销。
  • 我不同意你的评论者。输出参数味道不好,容易出错且不必要。
  • @StoryTeller Java bean 是否使用相同的封装方法?
  • @myuu - 是的。用于简单聚合的 getter 和 setter。

标签: c++ oop


【解决方案1】:

getter 函数是 setter 的对应函数。使用 setter,客户端代码可以设置值。使用 getter,客户端代码需要能够获取值。

我可以想到几种方法。

std::string const& get_url() const
{
   return this->url;
}

void get_url(std::string& url) const
{
    url = this->url;
}

您被要求使用第二种方法来实现它。

【讨论】:

    猜你喜欢
    • 2011-04-25
    • 2021-06-05
    • 1970-01-01
    • 1970-01-01
    • 2018-05-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多