好吧所以我正在尝试为C ++中的类创建一些类似于C#的属性。
例如,。在C#中我会这样做:
int MaxHP { get; set; }
或支持字段:
int MaxHP
{
get { return maxHP; }
set { maxHP = value; }
}
然而到目前为止,使用C ++,我只能通过以下方式复制它:
private:
int maxHP;
int maxEP;
public:
int GetMaxHP() { return maxHP; }
void UpSetMaxHP(int value){ maxHP += value; }
void DownSetMaxHP(int value){ maxHP -= value; }
int GetMaxEP(){ return maxEP; }
void UpSetMaxEP(int value){ maxEP += value; }
void DownSetMaxEP(int value){ maxEP -= value; }
我必须错过设计事物的方式。在C#中,属性可以像字段一样访问。但是在C ++中,我必须执行从其他对象访问时工作方式不同的函数。
我想我能做到:
public:
int MaxHP;
但这感觉我有点挫败了目的。所以我的问题是,我这样做是对还是有更好,更正确的方法来实现这个目标?
答案 0 :(得分:2)
您可以使用一个返回引用的函数,而不是创建单独的getter和setter函数,该函数可以以任何一种方式使用:
public:
int &max_hp() { return maxHP; }
与仅对maxHP public进行声明不同,这允许您放置断点以查看何时访问该变量,如果您以后想要添加条件或日志记录,则可以在不更改类接口的情况下执行此操作。
答案 1 :(得分:1)
C / C ++中不存在此功能。您可以轻易地认为这是一个缺失的缺陷,但并非所有语言都是平等的。 Java对C#不具备的一件事就是单例对象的枚举。否则,IMO,一种过时的语言,但它仍然有一个在C#中缺少的可靠功能。
所以我所说的是,当你遇到这些事情时,往往你会发现一个真正的弱点或设计缺陷。很高兴问你是否只是缺少一些东西(因此我的upvote)但是当你了解不同语言有哪些优点和缺点时,你将学习哪些语言对于哪些工作有用,并且可能更有效地编写DSL或语言扩展在你的职业生涯中,而不是以后。
答案 2 :(得分:0)
为了摆脱C ++中的getter和setter函数,我编写了一个简单的宏来获取和设置我在软件中使用的大多数数据类型。模板也可以用于此。 例如
#define GET_BOOL(name) bool is##name() const {return name##_;}
#define SET_BOOL(name) void set##name(bool name) {name##_ = name;}
#define GET_SET_BOOL(name) GET_BOOL(name) SET_BOOL(name)
答案 3 :(得分:0)
默认情况下,C / C ++不支持这样的任何东西,但是int getHP()
和void setHP(int)
这样的函数很常见,但是有一种运算符“hack”使其功能相当漂亮接近c#的get / set如何工作。但解决这个问题的代码非常混乱,可能会导致许多错误。
示例(第2篇帖子):http://forums.codeguru.com/showthread.php?459696-GET-SET-in-C