OOP设计 - 将类成员变量作为类中的方法参数传递

时间:2015-01-08 11:47:12

标签: c++ oop

以下是简单的示例代码,它不是最好的:

使用成员而不在参数中传递它:

class Car
{
public:
  void doSomething()
  {
    // doing something
    onEngineFailure();
  }
private:
  void onEngineFailure()
  {
    // Operate on m_Engine
  }
private:
  Engine m_Engine;
};

将成员作为参数传递:

class Car
{
public:
    void doSomething()
    {
        // doing something
        onEngineFailure(m_Engine);
    }
private:
  void onEngineFailure(const Engine& engine)
  {
    // Operate on engine
  }
private:
  Engine m_Engine;
};

在第一个示例中,方法onEngineFailure直接在类成员变量m_Engine上运行。没有必要将它作为函数参数传递,因为汽车只能有一个引擎,onEngineFailure操作的引擎将始终为m_Engine

在第二个示例中,方法onEngineFailure对通过参数传递的引擎进行操作。无论如何,这总是m_Engine

那么,哪一个在设计上更正确?如果方法已经访问成员变量并且它总是只对它进行操作,那么为什么将它作为参数传递。 但是,关于全局变量也可以这么说,但应尽可能使用全局变量。

2 个答案:

答案 0 :(得分:3)

  

那么,哪一个在设计上更正确?如果方法已经访问   成员变量,它将始终只在它上运行,那么为什么   把它作为论据传递。

完全。 1

  

然而,关于全局变量也可以这么说,

除了绑定到特定对象实例的变量与其他实例分开,并且它们的一致性在对象级别进行管理。由于封装,您可以隐藏它们并确保它们被正确使用。

通过类比,所有变量都驻留在RAM中,但它们是否仅仅是因为它的全局变量?不,因为它们之间的逻辑区别很重要。


1 在这个例子中,它可能没什么意义。但是,如果函数的功能通用性足以被其他类使用,那么使它成为自由函数或静态公共函数是有意义的。由于其他原因,将函数设为静态的能力有时也很重要,在这些情况下,显式(有时直接this)参数使其成为可能/更容易。

答案 1 :(得分:0)

第一个代码片段是优雅和干净的方式。由于成员函数可以访问数据成员,因此您不需要将数据成员作为参数传递。

如果你想根据外部输入改变数据成员状态(m_Engine),你会期望参数为(Engine)类型。它将以下列方式完成。

void doSomething(Engine engine)
{
    // doing something
    onEngineFailure(engine);
}
void onEngineFailure(const Engine& engine)
{
  // copy it here say m_Engine.model=engine.model;
}