C++ 使变量从某一点变为半只读

C++ 使变量从某一点变为半只读,c++,readonly,C++,Readonly,我想确保向量在某个点之后是不变的,这样我就可以安全地使用指向元素的指针 当然,我不能在某个点之后将其设置为const或readonly,我不想定义另一个变量,即const,因为这样向量就会被复制。此外,将向量的初始化放在构造函数中调用的函数中(当变量为只读时)会使我的代码结构不合逻辑 因此,我希望会有一个结构“笼”沿以下线路: caged<Type> object; object->change(); // underlying object changed object.lo

我想确保向量在某个点之后是不变的,这样我就可以安全地使用指向元素的指针

当然,我不能在某个点之后将其设置为const或readonly,我不想定义另一个变量,即const,因为这样向量就会被复制。此外,将向量的初始化放在构造函数中调用的函数中(当变量为只读时)会使我的代码结构不合逻辑

因此,我希望会有一个结构“笼”沿以下线路:

caged<Type> object;
object->change(); // underlying object changed
object.lock();
object->change(); // gives runtime error
const int data = object->getData(); // no problem
笼状物;
对象->更改();//基础对象已更改
lock();
对象->更改();//给出运行时错误
const int data=object->getData();//没问题
有没有这样的构想

否则怎么解决呢

我不想定义另一个变量const,因为 向量将被复制

不要复制,而是将向量移动到此变量中

尝试修改时引发运行时错误是错误的。编译时检查修改是正确的方法,C++唯一的机制是代码< const > /p> 使用函数初始化
const
变量是常用的方法。事实上,使用移动的局部向量初始化与使用隐式移动的函数结果初始化之间没有太大区别。正如@TartanLlama在评论中正确提到的,在后一种情况下,副本可能(通常)被完全删除

我不想定义另一个变量const,因为 向量将被复制

不要复制,而是将向量移动到此变量中

尝试修改时引发运行时错误是错误的。编译时检查修改是正确的方法,C++唯一的机制是代码< const > /p>

使用函数初始化
const
变量是常用的方法。事实上,使用移动的局部向量初始化与使用隐式移动的函数结果初始化之间没有太大区别。正如@TartanLlama在评论中正确提到的,在后一种情况下,复制可能(通常)被完全省略。

我看不出从函数中创建
常量向量的不合逻辑部分……您可以创建常量别名(常量引用)以避免复制,但这并不能阻止使用原始向量:-/你不把它传递给任何可以修改它的函数怎么样?更明确地说,只将其传递给
const&
const*
函数。我也不明白为什么在构造函数中实例化const(通过专用函数)是不合逻辑的。据我所知,这正是您所要求的逻辑。@Jarod42不合逻辑的部分不是在函数中创建常量向量,而是在构造函数中调用函数。首先调用一些函数来修改对象,然后我想冻结对象。我无法将所有这些函数放入构造函数中;它们在对象创建后被调用。我看不出从函数创建
常量向量
有什么不合逻辑的地方……您可以创建常量别名(常量引用)以避免复制,但这并不妨碍使用原始向量:-/您干脆不将其传递给任何可以修改它的函数如何?更明确地说,只将其传递给
const&
const*
函数。我也不明白为什么在构造函数中实例化const(通过专用函数)是不合逻辑的。据我所知,这正是您所要求的逻辑。@Jarod42不合逻辑的部分不是在函数中创建常量向量,而是在构造函数中调用函数。首先调用一些函数来修改对象,然后我想冻结对象。我无法将所有这些函数放入构造函数中;它们在对象创建后被调用。请注意,当从函数返回时,副本可能会被省略,这在move-construction中不是这样的。我仍然执行move。此外,我还有两个变量:常量和非常量。我想冻结对象,而不是定义另一个冻结对象。@Angelorf移动向量非常便宜。顺便问一下,为什么不能使用初始化函数?“冻结”对象是一个糟糕的设计。
const
的美妙之处在于它是万无一失的:编译器将为您的应用程序检查所有内容。我想您需要公开更多关于您的用例的详细信息,以便社区能够给您提供更精确的建议。@Mikhail我在程序中有多个地方出现了它。例如,从三维文件构建网格时,顶点存储在向量中,一旦调整大小,向量就会重新分配。在构建网格之后,我们知道不会发生调整大小的情况,因此我们使用指向向量中元素的指针。我希望能够确保不会发生调整大小的情况,这样当我看到一个指针指向一个非确定向量中的元素时,我就可以判断它是否是一个bug代码。@Angelorf听起来很简单。您只需要a)使网格中的顶点数组不可变,b)提供构造它的方法。对于a)封装在某个
网格
类中,该类不提供调整向量大小的接口。对于b)提供相应的
Mesh
构造函数。请注意,当从函数返回时,可以省略副本,这在move-construction中不是这样的。我仍然执行move。此外,我还有两个变量:常量和非常量。我想冻结对象,而不是定义另一个冻结对象。@Angelorf移动向量非常便宜。顺便问一下,为什么不能使用初始化函数?“冻结”对象是一个糟糕的设计。
const
的美妙之处在于它是万无一失的:编译器将为您的应用程序检查所有内容。我想你需要揭露更多