C ++ - 在内部,在定义类的成员函数时,是否应该使用成员变量名称或其getter函数?

时间:2015-10-25 00:41:21

标签: c++ class member-functions class-members member-variables

如果问题标题没有有效(或根本没有)反映我的实际问题,我道歉;这是我第一次询问或回答stackoverflow,可能已经搞砸了......

无论如何,我(详细说明)的问题是:

在需要使用私有成员变量的类中定义公共成员函数时,每个变量都有公共成员" getter"功能(请没有答案说"失去吸气剂/安装者......",我正在使用它们),它会更好 - 实际上更好&#34 ;,喜欢哪个使课程更加可扩展"在C ++编译器之间以及哪个选项允许更多"前向兼容性" - 使用this-> m_variable OR来使用this-> getm_variable()?

我已经从我正在处理的项目中包含以下代码示例(创建一个名为Family的类),以尝试澄清我的意思:

Family.h的片段

private:
    Person* children; // array of Person objects - Person is a member struct
    size_t numChildren;

public:
    enum gender { NONE = 0, MALE, FEMALE }
    size_t countChildren() { return numChildren; }
    size_t countChildren(gender g);
    Person* getChild() { return children; }

Family.cpp的片段

// this is the specific function example:
size_t Family::countChildren(gender g) {
    for (size_t i = 0; i < this->numChildren; i++) {
        ...CODE TO COUNT CHILDREN OF SPECIFIED GENDER...
    }
    return # of children with gender g   // pseudocode, obviously...
}

所以,现在针对示例改变了问题:

在我countChildren(gender g) i < this->numChildren;函数的定义中,使用i < this->countChildren();会更好(就我之前提到的指标而言)吗? 类似地,当迭代相同for循环的children数组时,使用Person* OR来定义当前迭代中的每个*(this->children + i)是否更好?使用*(this->getChild() + i);

提前感谢您的任何帮助,如果这个问题过于严重,我会道歉。#34;讨论为基础的&#34;对于stackoverflow,正如我之前提到的,这个我第一次提出问题。

2 个答案:

答案 0 :(得分:1)

在一个理想的世界中,你总是在内部使用getter来引用逻辑属性。这只有当所述属性被公开暴露时才真正重要;如果您发现自己编写的private吸气剂仅用于实施细节,请停止编码并获取咖啡,然后考虑您正在做什么。

为什么在内部使用吸气剂? 出于同样的原因,您可以在其他任何地方使用它们;他们对你班级代表的变化更有弹性。除了这个时候,不只是其他代码获得了好处,它也是这个类。

通过扩展,这使得扩展类更容易。 如果您希望countChildren为纯虚拟(或abstract,如果您更喜欢Java),并让不同的子类决定如何计算子项,该怎么办? (并不意味着你总是应该,但你可以That's a separate issue, though.

并且不要说“从函数调用中获得性能”。这可能会被优化,特别是如果getter是inline或非virtual

在实际的世界中,这是否真的重要取决于有多少人会使用你的代码,或者知道你的班级数据表示不太可能改变(这有时候实际上是合理的期望,比如数学向量)。

答案 1 :(得分:0)

我的个人偏见:使用成员函数而不是成员变量。如果您决定以不同方式表示成员变量,或使用Pimple idiom将其移动到帮助程序类中,则可以使用较少的代码进行修改。