最简单的方法是使用公共成员函数并隐藏实际属性。像这样:
class Creature {
public:
Creature(int numhands, int fingersperhand)
: m_numhands{numhands}, m_fingersperhand{fingersperhand}
{ }
int fingersPerHand() const { return m_fingersperhand; }
int numberOfHands() const { return m_numhands; }
int totalFingers() const { return numberOfHands() * fingersPerHand(); }
private:
const int m_numhands;
const int m_fingersperhand;
};
私有成员变量是一种实现细节。类的使用者只需在构造后使用三个公有成员函数来获取不同数量的手指,不需要关心其中两个返回常数存储数字,第三个函数返回计算出的值 - 这对用户来说是无关紧要的。
使用示例:
#include <iostream>
int main()
{
Creature human{2, 5};
std::cout << "A human has "
<< human.totalFingers() << " fingers. "
<< human.fingersPerHand() << " on each of their "
<< human.numberOfHands() << " hands.\n";
return 0;
}
如果 - 根据您的评论 - 您不想使用构造函数(虽然这是确保您不会忘记初始化成员的最安全方法),您可以像这样修改类:
class CreatureV2 {
public:
int fingersPerHand() const { return m_fingersperhand; }
int numberOfHands() const { return m_numhands; }
int totalFingers() const { return numberOfHands() * fingersPerHand(); }
void setFingersPerHand(int num) { m_fingersperhand = num; }
void setNumberOfHands(int num) { m_numhands = num; }
private:
int m_numhands = 2;
int m_fingersperhand = 5;
};
使用修改后的类的示例:
#include <iostream>
int main()
{
CreatureV2 human;
std::cout << "A human has "
<< human.totalFingers() << " fingers. "
<< human.fingersPerHand() << " on each of their "
<< human.numberOfHands() << " hands.\n";
CreatureV2 monster;
monster.setFingersPerHand(7);
monster.setNumberOfHands(5);
std::cout << "A monster has "
<< monster.totalFingers() << " fingers. "
<< monster.fingersPerHand() << " on each of their "
<< monster.numberOfHands() << " hands.\n";
CreatureV2 freak;
freak.setFingersPerHand(9);
// Note: I forgot to specify the number of hands, so a freak get
// the default 2.
std::cout << "A freak has "
<< freak.totalFingers() << " fingers. "
<< freak.fingersPerHand() << " on each of their "
<< freak.numberOfHands() << " hands.\n";
return 0;
}
注意:以上所有内容都假定您使用的是现代的C++14编译器。
typedef struct
。 - user2672107()
,或者创建一个带有operator int()
的代理对象,但最后一个选项在不带帮助的printf
省略号下无法工作。 - Jarod42#define totalNoOfFingers creature::totalfingers()
。 - George