繁体   English   中英

如何在C ++中声明不可变类(Java示例)

[英]how can I declare an immutable class in C++ (Java Example)

我怎么能用C ++做到这一点?

//java example
public class MyImmutable {
     private final int numToBeInitializedOnConstructionOrCompilationError;

     public MyImmutable(int n) {
         this.numToBeInitializedOnConstructionOrCompilationError = n;
     }
}

对于Java,如果最终属性在声明时未初始化,或者在构造函数上编译器将错误输出,则此代码有效,因为成员变量在构造函数中初始化。 如何在C ++中的类声明中强制实现不变性?

(仅定义公共getter方法不是一个可接受的答案,我知道'const'必须是解决方案的一部分)

如果我在C ++中这样做:

class MyImmutable 
{
  private:
     const int numToBeInitializedOnConstruction;

  public:
     MyImmutable(int n);
};

MyImmutable::MyImmutable(int n) 
{
  numToBeInitializedOnConstruction = n;
}

我得到以下错误,基本上告诉我我不能分配const成员,所以我猜const比java''final'更严格,是否有另一个关键字,或者有一种方法在声明后初始化const?

$ gcc const.cc 
const.cc:10:10: error: constructor for 'MyClass' must explicitly initialize the const member
      'numToBeInitializedOnConstruction'
MyClass::MyClass(int n) {
         ^
const.cc:3:13: note: declared here
  const int numToBeInitializedOnConstruction;
            ^
const.cc:11:36: error: read-only variable is not assignable
  numToBeInitializedOnConstruction = n;
  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ^
2 errors generated.

那么如何在C ++中声明java final成员变量的等价物呢? 这可能吗?

C ++可以以比Java更好的方式处理对象不变性。 首先,您可以使用const限定符从几乎任何类型中创建一个不可变对象。

const string str = "asd";
const MyClass myObj(1);

你也可以使用像numToBeInitializedOnConstruction那样的常量属性,但它必须在构造函数的成员初始化列表中初始化,如下所示:

MyImmutable::MyImmutable(int n)
 : numToBeInitializedOnConstruction(n) // like this
{
}

使用初始化列表如:

MyImmutable::MyImmutable(int n): numToBeInitializedOnConstruction(n) {}

编辑:只是一个更好的缩进。

要声明一个不可变对象 ,只需将其声明为const

const Foo myImmutableFoo;

要声明类的不可变属性,可以声明这些成员const - 但是您没有使用正确的语法来初始化它们。 鉴于:

class Foo
{ 
  const int mImmutableN;
public:
  Foo();
}; 

你不能在构造函数的主体中初始化mImmutableN ; 它必须在构造函数的初始化列表中初始化:

Foo::Foo()
:
  mImmutableFoo (42)
{
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM