在Java中断后返回C ++。尝试创建一个不可变的对象,并在使用Java工作之后,似乎最明智的做法是使用公共const变量(如Java final)。
public:
const int A;
很好,但是如果我想防御检查此值,我应该怎么做。下面的代码对我来说似乎很奇怪,但是与Java final成员不同,在防御性检查(编译器错误)之后,我似乎无法在构造函数中设置A。
MyObj::MyObj(int a) : A(a) {
if (a < 0)
throw invalid_argument("must be positive");
}
A的公共const变量比仅在其后方带有非const int的getter似乎是一个更清晰,更清洁的解决方案,但如果这是错误的做法,则可以接受该想法或其他想法。
您的示例应该可以正常工作:
class MyObj {
public:
const int var;
MyObj(int var) : var(var) {
if (var < 0)
throw std::invalid_argument("must be positive");
}
};
([Live example或with out-of-line constructor)
如果您希望MyObj
始终是不可变的,则const
成员是可能很好。如果您希望变量通常是不可变的,但是仍然可以通过赋值覆盖整个对象,那么最好使用getter来获得private
变量:
class MyObj {
int var;
public:
MyObj(int var) : var(var) {
if (var < 0)
throw std::invalid_argument("must be positive");
}
int getVar() const { return var; }
};
// now allows
MyObj a(5);
MyObj b(10);
a = b;