Jon*_*han 10 c++ getter setter pointers reference
我想知道C++ getter和setter的良好语法.
private:
YourClass *pMember;
Run Code Online (Sandbox Code Playgroud)
我猜这个setter很简单:
void Member(YourClass *value){
this->pMember = value; // forget about deleting etc
}
Run Code Online (Sandbox Code Playgroud)
和吸气剂?我应该使用引用还是常量指针?
例:
YourClass &Member(){
return *this->pMember;
}
Run Code Online (Sandbox Code Playgroud)
要么
YourClass *Member() const{
return this->member;
}
Run Code Online (Sandbox Code Playgroud)
他们之间有什么区别?
谢谢,
乔
编辑:
对不起,我将编辑我的问题...我知道引用和指针,我问的是引用和常量指针,作为getter,它们在我的代码中会有什么区别,比如在未来,我希望什么样的shoud如果我去某种方式会失败...
所以我想我会使用const指针而不是引用
const指针不能删除或设置,对吧?
RED*_*AIR 15
作为一般法律:
因此,如果可能使用NULL调用setter,请使用指针作为参数.否则使用参考.
如果调用包含NULL指针的对象的getter是有效的,它应该返回一个指针.如果这种情况是非法不变量,则返回值应为参考.如果成员变量为NULL,则getter应抛出异常.
小智 7
最好的方法是为客户端提供真正的OO接口,隐藏实现细节.Getters和Setters不是OO.
你的代码看起来很像,因为你已经习惯了不同的语言 - 在C++中使用this->x(例如)是相对不寻常的.当代码写得很好时,使用访问器或增变器也是如此.
虽然我在这方面非常不寻常,但我会再次记录(强调)迫使客户端代码直接使用访问器或更改器是一个坏主意.如果你真的有一种情况,即客户端代码操纵对象中的值是有意义的,那么客户端代码应该使用正常的赋值来读取和/或写入该值.
当/如果您需要控制分配的值时,运算符重载允许您在不对客户端代码强制获取/设置语法的情况下执行该控制.具体来说,您想要的是代理类(或类模板).仅举一个例子,人们想要获取/设置函数的最常见情况之一就是一个应该限制在某个特定范围内的数字.该setXXX检查在范围内的新的值,并且getXXX返回该值.
如果你想要,一个(相当)简单的模板可以更干净地完成工作:
template <class T, class less=std::less<T> >
class bounded {
const T lower_, upper_;
T val_;
bool check(T const &value) {
return less()(value, lower_) || less()(upper_, value);
}
void assign(T const &value) {
if (check(value))
throw std::domain_error("Out of Range");
val_ = value;
}
public:
bounded(T const &lower, T const &upper)
: lower_(lower), upper_(upper) {}
bounded(bounded const &init)
: lower_(init.lower), upper_(init.upper)
{
assign(init);
}
bounded &operator=(T const &v) { assign(v); return *this; }
operator T() const { return val_; }
friend std::istream &operator>>(std::istream &is, bounded &b) {
T temp;
is >> temp;
if (b.check(temp))
is.setstate(std::ios::failbit);
else
b.val_ = temp;
return is;
}
};
Run Code Online (Sandbox Code Playgroud)
这也使得代码更接近于自我记录 - 例如,当你声明一个像这样的对象时bounded<int>(1, 1024);,很明显意图是一个1到1024范围内的整数.有人可能会发现问题的唯一部分是1和/或1024是否包含在范围内.这与在类中定义int有很大的不同,并且期望每个看过类的人都意识到他们应该使用setXXX来强制执行一些(在那一点上未知的)可以是值的边界集.分配.
当您在类中嵌入其中一个时,将其设为公共变量,并且仍然强制执行该范围.在客户端代码中,没有真正的语法参数 - 您只需要像其他任何一样分配给公共变量 - 尝试分配超出范围的值的次要细节将引发异常.理论上,类应该采用策略模板参数来准确指定它在这种情况下的作用,但我从来没有真正的理由去理解它.