【问题标题】:Make variable semi-readonly from some point on从某个时候开始使变量半只读
【发布时间】:2015-08-12 09:18:10
【问题描述】:

我想确保向量在某个时间点后保持不变,以便我可以安全地使用指向元素的指针。

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

因此,我希望有一个“笼中”的构造,如下所示:

caged<Type> object;
object->change(); // underlying object changed
object.lock();
object->change(); // gives runtime error
const int data = object->getData(); // no problem

有这样的构造吗?

还有什么办法可以解决这个问题?

【问题讨论】:

  • 我没有看到从函数创建 const vector 的不合逻辑部分...
  • 您可以创建一个 const 别名(一个 const 引用)来避免复制,但这并不妨碍使用 original 向量:-/
  • 你干脆不将它传递给任何可以修改它的函数怎么样?更明确地说,只将其传递给 const&amp;const* 函数。
  • 我也不明白为什么在构造函数中实例化一个常量(通过一个专用函数)是不合逻辑的。据我了解,这正是您所要求的逻辑。
  • @Jarod42 不合逻辑的部分不是在函数中创建 const 向量,而是在构造函数中调用函数。首先调用一些修改对象的函数,然后我想冻结对象。我不能将所有这些函数都放入构造函数中;它们在对象创建后被调用。

标签: c++ readonly


【解决方案1】:

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

不要复制,而是将你的向量移动到这个变量中。

在修改尝试时引发运行时错误是邪恶的。在编译时检查修改是正确的方法,C++ 唯一的机制是const

用函数初始化const 变量是常用的方法。事实上,使用移动的局部向量或函数的结果进行初始化之间没有太大区别,函数的结果也是隐式移动的。正如@TartanLlama 在 cmets 中正确提到的那样,在后一种情况下,副本可能(并且通常是)完全省略。

【讨论】:

  • 请注意,当从函数返回时,副本可能会被省略,而在移动构造中则不然。
  • 我还是执行一个动作。此外,我被两个变量困住了:一个常量和一个非常量。我想冻结对象,而不是定义另一个冻结对象。
  • @Angelorf 移动向量非常便宜。顺便说一下,为什么不能使用初始化功能? “冻结”对象是一个糟糕的设计。 const 的美妙之处在于它是万无一失的:编译器会为你检查一切。我想您需要公开更多关于您的用例的细节,以便社区能够给您更准确的建议。
  • @Mikhail 我在程序中有多个位置发生它。例如,从 3D 文件构建网格时,顶点存储在向量中,一旦调整大小,就会重新分配。构建网格后,我们知道不会发生调整大小,因此我们使用指向向量中元素的指针。我希望能够确保不会发生调整大小,这样当我看到一个指向非确保向量中的元素的指针时,我可以确定它是否是错误代码。
  • @Angelorf 听起来很简单。您只需要 a) 使网格中的顶点数组不可变,并且 b) 提供一种构造它的方法。对于 a) 封装在一些 Mesh 类中,它根本不提供调整向量大小的接口。对于 b) 提供相应的Mesh 构造函数。
猜你喜欢
  • 2014-10-27
  • 1970-01-01
  • 1970-01-01
  • 2021-10-08
  • 1970-01-01
  • 2012-07-16
  • 1970-01-01
  • 1970-01-01
  • 2020-05-14
相关资源
最近更新 更多