繁体   English   中英

C ++私有函数:是否通过函数参数传递类成员变量

[英]C++ Private Functions: Whether to pass class member variable by function parameter, or not

这是C ++类实现中一次又一次出现的问题。 我很好奇人们的想法在这里。 您更喜欢哪种代码?为什么?

class A
{
public:
    /* Constructors, Destructors, Public interface functions, etc. */ 
    void publicCall(void);

private:
    void f(void);

    CMyClass m_Member1;
};

void A::publicCall(void)
{
    f();
}

void A::f(void)
{
    // do some stuff populating  m_Member1
}

或替代方案:

class A
{
public:
    /* Constructors, Destructors, Public interface functions, etc. */ 
    void publicCall(void);

private:
    void f(CMyClass &x);

    CMyClass m_Member1;
};

void A::publicCall(void)
{
    f(m_Member1);
}

void A::f(CMyClass &x)
{
    // do some stuff to populate x, 
    // locally masking the fact that it's really m_Member1
}

我想我总是更喜欢第二个,因为然后f可以在CMyClass任何实例上运行,但是,说,我有很多代码,其中第一个完全有效,因为f只会在m_Member1m_Member1而我真的打破了它分为两个函数,使代码更具可读性。

是的,这更像是一个讨论问题,而不是一个“答案”问题,但我对这个推理更感兴趣。 我会将答案标记为答案,提供良好的推理或良好的标准。

另外,请记住,这只是一个玩具示例。 在现实中,这个班级将比这更大,因此组织很重要。

既然你要求意见,如果一个独立的f(CMyClass&)函数有意义且可实现,那么我也赞成这个选项。 我会选择第一种情况,如果f执行的操作仅在A类的上下文中有意义,如果CMyClass仅在A的上下文中有意义,或者它依赖于A其他属性。 我认为必须根据问题做出决定。

一如既往,这取决于。 每种情况都不同。

在你给出的具体例子中 - 首先我排除了你的选择( void A::f(CMyClass &x) ),主要是因为它“闻起来”不好(正如Martin Fowler所说)。 它是一个私有函数,除非您现在需要将其用于其他实例,否则请使用该成员。 如果需要,您可以随时重构它。

想象一下如果f有2个参数会发生什么。 3个参数。 10.每次发送它们是否有意义? 拥有这些参数成员不是更好吗?

如果f必须将其中一些参数发送给A其他方法怎么办? 使用成员为此更有意义吗?

所有这一切都假设f确实需要A持有的其他信息,否则我将其移动为CMyClass的方法。

问问自己:用m_Member1以外的对象调用f() ,它现在有什么意义,或者在可预见的将来是否有任何意义?

如果答案是:

  • 无参数f()m_Member1A的固有部分。
  • 是的 f(CMyClass &) 即使现在你只使用m_Member1 ,这也不是你处理的类的内在属性。
  • 也许吧 好吧......我会说参数无参数f() 总有一种选择可以改变你的想法(实际上,如果变化相当微不足道)。

另请注意,函数f()可以调用另一个函数g(CMyClass &) ,但不能相反。 因此,根据f()作用,这可能会限制您的选择。

第二个例子中的f不是A或全局函数的静态函数,或者是CMyClass的成员函数吗?

当然,有些情况下,每次调用该函数时最好发送参数,但是当你已经拥有A对象中的CMyClass对象时,为什么还要重新发送它。 如果您需要两个CMyClass对象进行交互,最好将其添加到CMyClass成员函数列表中,而不是添加到A

此外,正如清洁代码所述,你最好使用没有任何参数的函数,而不是带有参数的函数。 当另一个程序员试图读取该函数时,除了函数名之外,它必须解密/注意第二个参数。

我的答案将基于背景。 如果现在或某天可能有多个成员变量实例可能会运行,那么请确保将它们作为参数传递给它们。 但是,如果f对A实例的状态的特定元素进行操作,我不会传递任何内容。 在很多情况下,A中总会只有一个foo。在这一点上,使foo成为f的参数变得愚蠢。 并且效率稍差,除非f是内联的,因为不仅是这个指针被传递,而且还有foo的地址,这是一个额外的副本到堆栈上。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM