如果问题标题没有有效(或根本没有)反映我的实际问题,我道歉;这是我第一次询问或回答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,正如我之前提到的,这个是我第一次提出问题。
答案 0 :(得分:1)
在一个理想的世界中,你总是在内部使用getter来引用逻辑属性。这只有当所述属性被公开暴露时才真正重要;如果您发现自己编写的private
吸气剂仅用于实施细节,请停止编码并获取咖啡,然后考虑您正在做什么。
为什么在内部使用吸气剂? 出于同样的原因,您可以在其他任何地方使用它们;他们对你班级代表的变化更有弹性。除了这个时候,不只是其他代码获得了好处,它也是这个类。
通过扩展,这使得扩展类更容易。 如果您希望countChildren
为纯虚拟(或abstract
,如果您更喜欢Java),并让不同的子类决定如何计算子项,该怎么办? (并不意味着你总是应该,但你可以。That's a separate issue, though.)
并且不要说“从函数调用中获得性能”。这可能会被优化,特别是如果getter是inline
或非virtual
。
在实际的世界中,这是否真的重要取决于有多少人会使用你的代码,或者知道你的班级数据表示不太可能改变(这有时候实际上是合理的期望,比如数学向量)。
答案 1 :(得分:0)
我的个人偏见:使用成员函数而不是成员变量。如果您决定以不同方式表示成员变量,或使用Pimple idiom将其移动到帮助程序类中,则可以使用较少的代码进行修改。