【发布时间】:2014-11-29 17:21:26
【问题描述】:
我有一个派生自包含其自己的成员变量的基类的类。为了将类中的所有内容都封装起来,我试图找出一种干净的方法来设置此成员变量,同时以相同的方法检索它。这是该方法的样子(这是伪代码,可能无法编译):
class Base
{
virtual void MyVirtualMethod(double &output1, Object &output2)
{
// do base class stuff (does not set output1 because it does not need to)...
output2 = whatever;
}
}
class Derived
{
public:
virtual void MyVirtualMethod(double &output1, Object &output2)
{
// do derived class stuff...
m_DerivedMember = whatever;
// do more stuff...
output1 = m_DerivedMember;
output2 = whatever2;
}
private:
double m_DerivedMember;
}
调用代码#1
std::vector<DataPack> dataPack;
for each Base pointer...
{
double output1(100); // some default value
Object output2;
base->MyVirtualMethod(output1, output2);
dataPack.push_back(DataPack(output1, output2));
}
调用代码#2
double output1(100); // some default value
Object output2;
base->MyVirtualMethod(output1, output2);
// do more stuff but does not actually use output1, just output2...
虽然这可行,但对我来说似乎并不干净。我想我问自己的更大问题是同时使用与 getter 和 setter 相同的方法是否是个好主意?谢谢!
【问题讨论】:
-
“我想我要问自己的更大的问题是,使用与 getter 和 setter 相同的方法是否是个好主意……”您的示例中没有任何 getter/setter 函数?
-
我的意思是在同一方法中设置和获取成员变量是否是个好主意。它没有标记为 Get 或 Set 方法,而是在它设置和获取该成员变量的方法内部。
-
这就是所谓的状态操作(与getter/setter无关)。如果不允许这样,OOP 的整个概念将毫无用处。
-
在 C++ 中,“getter”和“setter”通常被称为 mutators 和 accessors。我认为从 mutator 返回值没有错。
-
谢谢大家!我想出了一种不同的方法来清理它,但它基本上涉及将设置器部分移动到其他地方。这是一个额外的函数调用,但不是世界末日,因为这项工作不是在关键线程上完成的。