【问题标题】:Best practices accessing members in function with const reference parameter in C++在 C++ 中使用 const 引用参数访问函数成员的最佳实践
【发布时间】:2018-07-01 00:42:49
【问题描述】:

实现以下场景的最佳做法是什么:
Class A 持有类型为 B 的成员对象。

class A
{
private:
  B b;
};

class B
{
private:
  int x;
};

A 类型的对象作为const & 参数的打印函数应该打印ab 的成员:

void Print(const A& a)
{
  cout << a.b.x;
}

读取函数应设置a(和b)及其成员的值:

void Read(A& a)
{ 
  // ...
  a.b.x = 2;
}

class A 的成员访问权限应该如何实现?

  • b”应该公开吗?
  • class A”是否应该为 b 提供 2 个 getter(1 个用于写入,1 个用于对“b”的读取)?

其他信息:
在我的真实系统中,AB 类要大得多,它们是一个巨大的遗留系统的一部分。在这个遗留系统中,PrintRead 是“视图模型”的成员函数,其中 Print 将值写入 GUI,Read 从 GUI 读取值并设置 A 的成员和B。所以AB 的职责是保存数据(某种数据模型)。​​

【问题讨论】:

  • 为什么不把读写的责任转移到B,或者在这种情况下PrintRead的另一个重载?不过,您需要将这些函数设为成员或friend
  • 我特别喜欢Read 函数的实际写入方式。让他们猜测并保持警惕。

标签: c++ reference parameter-passing constants


【解决方案1】:

您应该改用成员函数,并尽可能封装数据。为此,Print 可以是A 的成员函数:

class A
{
    B b;
public:
    void Print() const /*Let's add some const correctness*/
    {
        b.Print();
    }
};

class B
{
    int x;
public:
    void Print() const
    {
        std::cout << x;
    }

    B& operator=(int new_x) /*Standard form of the assignment operator*/
    {
        x = new_x;
        return *this;
    }
};

请注意,我为B 提供了一个赋值运算符。然后你可以在 A 类中构建一个函数:

void setX(int x)
{
    b = x;
}

最后,对于您的打印,惯用的方法是将&lt;&lt; 重载为std::ostream。然后你可以删除你的Print 函数。见How to properly overload the << operator for an ostream?

【讨论】:

    猜你喜欢
    • 2014-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多