2016-12-03 91 views
2

现状:“属性”类方法而不是C++中的getter&setters?

class Person { 
public: 
    int& age(); 
    int age() const; 
private: 
    int m_age; 
}; 

我不知道这是否正常工作,因为我觉得,所以我的第一个问题是这样的:

  • 有了这些方法,我可以创造C#一样“属性” ?我的意思是:
    • 随着第一方法我可以实现当事情改变m_age的价值应该发生什么。
    • 随着第二我可以实现什么应该发生的东西使用m_age的值

例子:

Person p; 
p.age() = 15; //first method is called? 
std::cout << p.age(); //second method? 

我开始认为这是完全愚蠢的是基于混合运算符重载和const方法,所以请:可能有人告诉我吗? :D

如果奇迹般地工作,我可以用这个代替吸气剂& setters或这是一个不好的练习?

+0

怎么会不带参数的setter工作? –

+1

@Eli我认为setter通过引用返回m_age。 –

+0

使用返回的参考。或者,这是唯一的作品,如果方法是内联? @TonyJ是 – Tudvari

回答

2

YES和NO。

属性是用于隐藏函数的语法糖。所以是的。你可以编写一个函数来返回一个引用,并获得一些表面上看起来像属性的东西。

但考虑一下:属性后面是一个setter函数,它可以(而且应该)不仅仅是设置一个值。任何setter的要点是确保设置该值不会损害对象的状态。

通过用一个函数替换setter,该函数返回一个对private成员的未受保护的引用,您正在剥离这条防线。调用者可以使用该参考,因为他们认为合适,并可能损害该对象。这可能会很好,取决于会员的性质,但你可能是诚实的。宣布该成员public,提高可读性,并保存自己写的函数的麻烦。

至于问题的const一部分,您可以排序的(这是一个丑陋的,简单的那种“之类的”)认为int& age()int& age(Person * this)int age() constint age(const person * this)

在OP的例子,age()永远不会调用上的恒定Person,所以没有理由int age() const永远被调用。

3

你的代码编译好,按预期工作:

#include <iostream> 

class Person { 
public: 
    int& age() { return m_age; } 
    int age() const { return m_age; } 
private: 
    int m_age; 
}; 

int main() { 
    Person p; 
    p.age() = 15; //first method is called? 
    std::cout << p.age(); //second method? 
} 

See Live Demo


如果奇迹般地这个工程,我可以用它来代替干将& setter方法或者这是一个运动不好? (重点煤矿)

不,这不能被用作二传手功能的真正的替代品。
返回到一个成员变量的基准给予客户的完全控制该成员变量,该变量是由设定器不同

void age(int newValue) { 
    if(newValue > 150) { 
     throw std::invalid_argument("You're older than 150? We don't believe that!"); 
    } 
    m_age = newValue; 
}; 
+0

哈!打我8秒。教我校对。不过,稍微不同的旋转,所以我会保持住我的答案。 – user4581301

+0

@ user4581301可能是我在代码中比思考更多:P –

+0

如果我能接受1个以上的答案,我会接受这两个答案,但散文更详细,所以我接受了。对不起,感谢您的帮助! :) – Tudvari

相关问题