如何在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的"最终"更严格,是否有另一个关键字,或者有一种方法可以在声明const后初始化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最终成员变量的等效内容?这可能吗?
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)
{
}
相关文章:
- 激励'inline'说明符的真实世界示例?
- 为什么示例代码访问IUnknown中已删除的内存
- 以下示例中如何避免代码复制?C++/库达
- 在java中解决这段代码时面临循环中的问题
- 尝试用java代码编译和运行c++代码
- 在这种情况下,java对象是否可以调用本机函数
- "类模板示例<int>;"语句对 C++11 是什么意思?
- 在java中读取c++字节的位字段
- 示例C++项目编译中的警告
- 示例外壳应用程序显示的 V8 "segmentation fault (core dumped)"错误
- 当Microsoft文档仅包含 C# 示例时,如何查找 C++ 包含文件名
- 为什么C++对链表中的下一个节点使用指针,而像 C# 或 Java 这样的语言只使用类 Node 的名称?
- 使用已使用 java 编码的 openssl 解码数据
- 从WordCount Hadoop示例调用Helloworld Jni函数,给出错误Java.lang.unsatisf
- 将Java状态机示例转换为C++,陷入最后一道障碍
- 如何在C 中声明不变的类(Java示例)
- java.lang.UnsatisfiedLink错误 当尝试遵循 MIT 关于 SWIG 使用C++回调的示例时
- 在c++中创建一个静态类计数器(java示例)
- 寻找安卓Java AES加密、NDK C/C++解密和反之亦然的源代码示例
- (初学者)c++构造函数和方法的继承,使用一个Java示例作为起点