我一直想知道有没有办法让一个班级成员不使用只能由它的类修改的getter?
我在想的是这样的事情。
class A
{
public:
crazyconst int x;
void doStuff()
{
// Gettin' stuff done
x = someValue; // OK
}
};
int main(int argc, char** argv)
{
A a;
a.x = 4; // ERROR
}
所以它是可见的,但对于班上的每个人都是只读的。
答案 0 :(得分:6)
您的课程可以对私人非const
数据成员进行公开const
引用。
编辑:但是,我应该指出,这样做会阻止您使用编译器生成的复制构造函数和复制赋值运算符。
答案 1 :(得分:4)
答案是不,如果没有某种吸气剂你就不能做到这一点。但是,您可以使getter可重用,并且您可以使字段的简单语法(大部分)工作,而不用括号。
(需要C ++ 11)
template<typename Friend, typename FieldType>
class crazyconst
{
FieldType value;
friend Friend;
FieldType& operator=(const FieldType& newValue) { return value = newValue; }
public:
operator FieldType(void) const { return value; }
FieldType operator()(void) const { return value; }
};
class A
{
public:
crazyconst<A, int> x;
void doStuff()
{
// Gettin' stuff done
x = 5; // OK
}
};
int main(int argc, char** argv)
{
A a;
int b = a.x;
int c = a.x(); // also works
}
C ++ 03版:http://ideone.com/8T1Po
但要注意,这会编译但不能按预期工作:
const int& the_x = a.x;
a.doStuff();
std::cout << the_x;
OTOH,这应该没问题:
const auto& ref_x = a.x;
a.doStuff();
std::cout << ref_x;