gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 23:25:30 25 4
gpt4 key购买 nike

我如何在 C++ 中执行此操作?

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

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

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

(仅定义公共(public) 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 限定符从几乎任何类型创建不可变对象(immutable对象)。

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

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

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

关于java - 如何在 C++ 中声明一个不可变类(Java 示例),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21267176/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com