我有类似
的东西class X
{
private:
someclass obj;
public:
someclass& get()
{
return obj;
}
};
我不想让obj公开,所以我得到它的参考并将其传递给函数。 这是一个好的/好的练习还是彻头彻尾的邪恶?
答案 0 :(得分:7)
如果您在代码中传递非const引用,则可以从类外部修改obj
。如果您希望无法从外部X
更改它,则必须返回const ref,
const someclass& get();
请注意,在这种情况下,值得在函数名称
之后添加另一个constconst someclass& get() const;
告诉编译器在get()
上调用X
不会改变其内部状态。 (这不是你的例子)
答案 1 :(得分:6)
这不是邪恶的。它应该如何完成:您可以返回对内部数据成员的引用。如果你不想要副本,你不需要通过指针或值来做:引用是为了做到这一点。
如果您不希望修改它,则必须向内部数据成员返回“const”引用:
public:
const someclass & get() const
{
return obj;
}
请注意,然后我在get()方法的末尾添加了const,以指示使用此方法不会修改类。
答案 2 :(得分:5)
没关系。
只考虑使引用保持不变,或至少制作两个get()
方法(一个用于普通方法,一个用于常量对象)。
答案 3 :(得分:2)
您所做的是技术上正确的:您可以参考用于更改它的X的内部部分。
唯一需要注意的是X本身的寿命比存储返回参考的地方长。
这没有任何邪恶。
邪恶的事情是另一个:你允许obj
完全访问任何能够get()
(几乎每个人)的人。你发挥公共obj
本身就是一种效果,让人觉得它仍然是私密的。
如果你接受每个人都可以修改obj ...只需将其公开。
如果您想要“某人”可以,请将其保密,将某人设为朋友。
如果您希望任何人以只读方式访问obj
,请返回一个const&从const函数开始。
答案 4 :(得分:1)
许多书籍建议不要直接访问变量并使用GET / SET方法,如:
class SetandGet
{
public:
void Set(int x){
TheVariable = x;
}
int Get(){
return TheVariable;
}
private:
int TheVariable;
}
答案 5 :(得分:0)
我认为这很邪恶。如果obj
的包含实例将被销毁,并且您无法强制X
的调用者将此考虑在内,则X::get()
将被销毁:
someclass & evil() {
X x;
return x.get();
}
肯定是邪恶的; - )
通过引用返回的唯一安全事项是成员函数中的*this
或者首先通过引用获取的参数。
如果obj
足够小,则按值返回,否则实现某种方式共享其所有权。 Boost.SharedPtr,现在是C ++标准的一部分,可能会有所帮助。