在几乎所有情况下,当您认为必须创建 setter 和 getter(即同时创建两者)时,您的设计是错误的。
反倒想有什么目的num_chests
?你不能去任何地方不知道它是什么。
根据您的代码,我猜它包含关卡上的箱子数量。在这种情况下,您不想为每个人提供此值的设置器。您希望该值等于游戏中的箱子数量,并且通过在此处提供 setter,每个人都可以使该不变量无效。
相反,您可以只提供 getter,并且您可以控制它在您的班级中的价值。
class Chest : public GameObject
{
public:
Chest() { ++num_chests_; }
~Chest() { --num_chests_; }
static int num_chests() { return num_chests_; }
private:
static int num_chests_;
};
int Chest::num_chests_ = 0;
在我看来,关于为什么 getter 和 setter 是错误决定的更多解释。如果你提供 setter 和 getter,你只会有控制变量的错觉。考虑std::complex
。为什么是
std::complex<double> my_complex(1.0, 5.0);
my_complex.real(my_complex.real()+1);
好过
std::complex<double> my_complex(1.0, 5.0);
my_complex.real()++;
答案:在std::complex
设计时,C++ 中没有引用。此外,Java 没有 C++ 风格的引用,因此他们必须到处编写样板代码。现在,GCC 在此处返回非常量引用作为扩展,而 C++11 允许
reinterpret_cast<double (&)[2]>(non_const_non_volatile_complex_variable)[0]
和
reinterpret_cast<double (&)[2]>(non_const_non_volatile_complex_variable)[1]
作为访问std::complex<value>
.