将防御性检查值分配给C ++ 17中不可变类中的公共const变量的方法?

问题描述 投票:0回答:1

在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似乎是一个更清晰,更清洁的解决方案,但如果这是错误的做法,则可以接受该想法或其他想法。

c++17 immutability
1个回答
0
投票

您的示例应该可以正常工作:

class MyObj {
public:
  const int var;
  MyObj(int var) : var(var) {
    if (var < 0)
       throw std::invalid_argument("must be positive");
  }
};

([Live examplewith 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;
© www.soinside.com 2019 - 2024. All rights reserved.