【问题标题】:array class member with different size for each class instance每个类实例具有不同大小的数组类成员
【发布时间】:2021-07-18 01:54:06
【问题描述】:

我想要一个包含数组成员的类,但构造函数允许我设置数组成员的大小。

这可行吗?我不需要动态分配,因为一旦创建了类实例,数组就不需要改变大小,只是每个类实例都有不同的大小。

【问题讨论】:

  • 一个类有一个大小。时期。如果大小是在运行时确定的,即使确定后是固定的,那也是动态的。无论您在没有动态分配的情况下更改大小,都不是在做您认为正在做的事情,或者是在滥用某种未定义的行为。
  • 一旦创建了类实例——我猜你错过了第一步。如果没有某种“动态”大小确定,将如何创建数组?只是数组的创建本身是动态的。数组创建后你做的是你的事,不管你是否想调整它们的大小。
  • 所以不可行。你的实际目标是什么?也许我们可以提出替代方案或解决方法。
  • @user4581301 我想要一个带有 lambda 数组的类,用于管理屏幕上的小部件。但是这些小部件可能有不同数量的按钮来触发不同的效果,所以有些可能需要 1 个 lambda,而另一些可能需要 3 或 4 个!但这是针对嵌入式系统的,因此使用 lambda 向量不起作用,因为向量在此环境中不可用..
  • 您可以静态分配一个对象,该对象包含一个最大合理大小的数组。如果您知道最多可以有三个或四个随便什么,则分配一个 4 的数组。如果您不知道实际的峰值,您可以猜测或放弃静态分配并使用 @ 制作自己的简单 vector观察RAII的987654321@。您不需要它来调整大小或迭代器以及 vector 的其余部分,所以这是一项相对简单的工作。

标签: c++ arrays class


【解决方案1】:

尽管有几个 cmets 认为这是不可能的,但实际上并非不可能。

当然,最简单的方法是使用间接寻址并在构造期间以正常方式分配数组(使用a = new type[size] 并调用delete[] a - not delete a - 在析构函数)。

但是如果出于某种原因你真的不想让数组数据与你的对象分开分配,你可以使用placement-new将你的对象构造成一个足够大以包含所有元素的预分配缓冲区.这样可以避免为您的数组单独分配,并且您仍然可以拥有动态大小。

不过,我不建议使用这种技术,除非你真的有一个要求很高的用例。

【讨论】:

  • 如果我没看错,您是在暗示 C 中所谓的灵活数组成员。这违反了 C++ 语言规则。你能做到吗?是的,但语言不保证结果。您不能制作这些对象的数组,因为数组依赖于固定大小的对象(以及正确的对齐方式等)。当然你也可以解决这个问题,但是你不会再有一个简单的对象数组了。
  • 另外一个小提示:当 Paul 和我在上面提到的 cmets 中不可能的事情时,我们指的是静态分配动态大小的结构。您可以使用诸如过度配置之类的技巧,但它们仍然只能容纳这么多(并且通常会浪费大量空间)。只要您通过引入newmalloc 或其他方式来解决此限制,静态分配就会立即消失。
  • @user4581301 是的,非常正确。这就是为什么我不推荐它。通过在编译器中启用相应的扩展,您可以拥有 C 风格的灵活数组。另一个不太受欢迎的技巧是声明大小为 1 的数组,并向静态代码分析器道歉,因为它们似乎是有界限的读取。当然,在 99.999% 的可以想象的情况下,最好只单独分配数组。
猜你喜欢
  • 1970-01-01
  • 2018-11-19
  • 1970-01-01
  • 2023-03-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-17
  • 1970-01-01
相关资源
最近更新 更多