C++ - 在内部,当定义一个 class 的成员函数时,应该使用成员变量名还是它的 getter 函数?
C++ - Internally, when defining a class's member functions, should the member variable name or its getter function be used?
如果问题标题不能有效(或根本不能)反映我的实际问题,我深表歉意;这是我第一次在 Whosebug 上提问或回答,可能搞砸了...
无论如何,我的(详细的)问题是:
在 class 中定义需要使用私有成员变量的 public 成员函数时,每个成员变量(私有变量)都有 public 成员 "getter" 函数(请不要回答说 "lose the getters/setters...",我正在使用它们),会不会更好——实际上是 "better",就像这使得 C++ 编译器和之间的 class 更多 "extensible"哪个选项允许更多 "forward compatibility" -- 使用 this->m_variable 或使用 this->getm_variable()?
我从我目前正在进行的项目中包含了以下代码示例(创建一个 class 命名的 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 数组时,在当前迭代中使用 *(this->children + i)
或使用 *(this->getChild() + i);
定义每个 Person*
会更好吗?
预先感谢您的任何帮助,如果这个问题对 Whosebug 来说太过 "discussion-based",我深表歉意,正如我之前提到的,这 是 我第一次问问题。
我个人的偏见:使用成员函数而不是成员变量。如果您决定以不同的方式表示成员变量,或者使用 Pimple idiom 将其移至助手 class,您将需要修改更少的代码。
在理想情况下,您总是在内部使用 getter 引用逻辑属性。 只有当所述属性要公开时,这才真正重要;如果您发现自己正在编写仅用于实现细节的 private
getter,请停止编码并喝杯咖啡,然后想想您在做什么。
为什么在内部使用 getters? 出于同样的原因,您可以在其他任何地方使用它们;他们对您的 class' 表示形式的变化更有弹性。除了这一次,不仅仅是其他代码获得了好处,它也是 class。
通过扩展,这使得扩展 classes 变得更加容易。 如果你想让countChildren
成为纯虚(或者abstract
,如果你更喜欢Java),让不同的subclass怎么办? es决定如何计数children? (并不意味着你总是应该,但你可以。That's a separate issue, though.)
并且不要说 "performance hit from function calls"。这可能会被优化掉,特别是如果 getter 是 inline
或非 virtual
.
在现实世界中,这是否真的重要取决于有多少人会使用您的代码,或者是否知道您的 class' 数据表示不太可能改变(有时实际上是合理的期望,例如数学向量)。
如果问题标题不能有效(或根本不能)反映我的实际问题,我深表歉意;这是我第一次在 Whosebug 上提问或回答,可能搞砸了...
无论如何,我的(详细的)问题是:
在 class 中定义需要使用私有成员变量的 public 成员函数时,每个成员变量(私有变量)都有 public 成员 "getter" 函数(请不要回答说 "lose the getters/setters...",我正在使用它们),会不会更好——实际上是 "better",就像这使得 C++ 编译器和之间的 class 更多 "extensible"哪个选项允许更多 "forward compatibility" -- 使用 this->m_variable 或使用 this->getm_variable()?
我从我目前正在进行的项目中包含了以下代码示例(创建一个 class 命名的 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 数组时,在当前迭代中使用 *(this->children + i)
或使用 *(this->getChild() + i);
定义每个 Person*
会更好吗?
预先感谢您的任何帮助,如果这个问题对 Whosebug 来说太过 "discussion-based",我深表歉意,正如我之前提到的,这 是 我第一次问问题。
我个人的偏见:使用成员函数而不是成员变量。如果您决定以不同的方式表示成员变量,或者使用 Pimple idiom 将其移至助手 class,您将需要修改更少的代码。
在理想情况下,您总是在内部使用 getter 引用逻辑属性。 只有当所述属性要公开时,这才真正重要;如果您发现自己正在编写仅用于实现细节的 private
getter,请停止编码并喝杯咖啡,然后想想您在做什么。
为什么在内部使用 getters? 出于同样的原因,您可以在其他任何地方使用它们;他们对您的 class' 表示形式的变化更有弹性。除了这一次,不仅仅是其他代码获得了好处,它也是 class。
通过扩展,这使得扩展 classes 变得更加容易。 如果你想让countChildren
成为纯虚(或者abstract
,如果你更喜欢Java),让不同的subclass怎么办? es决定如何计数children? (并不意味着你总是应该,但你可以。That's a separate issue, though.)
并且不要说 "performance hit from function calls"。这可能会被优化掉,特别是如果 getter 是 inline
或非 virtual
.
在现实世界中,这是否真的重要取决于有多少人会使用您的代码,或者是否知道您的 class' 数据表示不太可能改变(有时实际上是合理的期望,例如数学向量)。