【问题标题】:How to define a static array without a contant size in a constructor of a class? (C++)如何在类的构造函数中定义没有内容大小的静态数组? (C++)
【发布时间】:2010-04-02 23:06:47
【问题描述】:

我有一个类定义为:

class Obj {
public:
    int width, height;
    Obj(int w, int h);
}

我需要它包含一个像这样的静态数组:

int presc[width][height];

但是,我无法在类中定义,因此可以创建指向 2D 数组的指针(出于好奇,还可以创建 3、4 和 5D 数组),并将其作为类的成员,并且在构造函数中初始化它:

int ar[5][6];
Obj o(5, 6, &ar);

编辑:这里的想法是每个对象都有不同的宽度和高度,所以我用来表示该对象的数组对于该对象将是唯一的,但是一旦定义了该数组(最好在构造函数中),它不会改变。并且特定对象的宽度和高度值在编译时是已知的。

编辑:这些数组用于碰撞检测,方法是将两个对象的 presc 数组叠加到一个大数组上,并查看重叠的位置,声明如下:

Obj player1(32, 32); //player with a width of 32 px and height of 32 px, presc[32][32]
Obj boss(500, 500); //boss with a width of 500 px and height of 500 px, presc[500][500]

【问题讨论】:

  • 每个 Obj 对象是否都具有恒定的宽度和高度?
  • 宽度和高度一旦定义,就不会改变,但每个对象的宽度和高度都会不同。
  • 你能告诉我们用法吗?您如何在编译时获取数组大小?

标签: c++ class dynamic-arrays static-array


【解决方案1】:

没有。类的大小需要在编译时知道。

如果您在运行时才知道数组的大小,则不能将该数组作为类成员(您需要动态分配数组并将指向它的指针存储在类中,或者,最好使用std::vector)。

【讨论】:

  • 我确实知道编译时数组的大小,只是每个对象的大小都不一样,所以我不能使用常量变量。
  • @Keand64:在这种情况下,您可以选择使用模板在编译时设置宽度和高度,就像 Marcelo 在他的回答中演示的那样。这样做的代价是具有不同数组维度的对象具有不同的类型。您也许可以通过使用继承来解决这个问题,但它可能会变得混乱。
【解决方案2】:

如果“动态”是指“堆分配”,那么不,当前的 Obj 没有办法做到这一点。 OTOH,如果您在编译时知道wh

template <int W, int H>
class Obj {
public:
    // ...
private:
    int presc[W][H];
}

【讨论】:

  • 这和原来的代码一样,只是在模板里装扮了一下。如果他在编译时知道 w 和 h,那么他的原始代码可以使用您替换模板参数的任何内容。
  • 实际上 w/width 和 h/height 在编译时是已知的(如果我一开始不清楚,请道歉)。这个想法是,我会在编译时知道特定对象的 h 和 w 值,它们只是不会对每个对象都相同,因此我必须使用变量来确定大小。
  • @Ben,建议 OP 没有想到的正确答案有什么问题?
  • 我在 OP 更新问题之前写了回复,以明确他需要具有不同 h 和 w 的多个版本的类。使用模板类确实是最好的解决方案。
  • 感谢您的同意,@Ben。但为了清楚起见,我也在 OP 澄清要求之前写了我的回复。这就是为什么我在我的示例代码前面加上“如果你在编译时知道 hw”。
【解决方案3】:

boost::arraystd::tr1::array 都提供了固定大小的数组。理解这些创造了全新的类型;不使用动态数组可能会使你的很多代码比它需要的更难编写。您必须参数化您的类,以及在这些对象上工作的任何函数。您将节省的只是单个堆分配。

【讨论】:

    猜你喜欢
    • 2019-11-26
    • 2020-08-24
    • 2019-04-21
    • 2021-07-06
    • 1970-01-01
    • 1970-01-01
    • 2011-10-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多