C++ 如何在类的构造函数中定义没有常量大小的静态数组?(C+;+;)

C++ 如何在类的构造函数中定义没有常量大小的静态数组?(C+;+;),c++,class,dynamic-arrays,static-array,C++,Class,Dynamic Arrays,Static Array,我有一个类定义为: 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); 编辑:这里的想法是每个对象都有不同的宽

我有一个类定义为:

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]
如果“dynamic”是指“heap-allocated”,那么就没有办法用当前的Obj实现这一点。OTOH,如果您在编译时知道
w
h

template <int W, int H>
class Obj {
public:
    // ...
private:
    int presc[W][H];
}
模板
Obj类{
公众:
// ...
私人:
int PREC[W][H];
}

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


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

,两者都提供恒定大小的数组。理解这些创造了全新的类型;不使用动态数组可能会使许多代码编写起来比需要的更困难。您必须参数化您的类,以及在这些对象上工作的任何函数。您只需要保存一个堆分配

是否每个Obj对象都有恒定的宽度和高度?一旦定义了宽度和高度,它们将不会更改,但每个对象都有不同的宽度和高度。您能告诉我们使用方法吗?如何在编译时获得数组大小?这与原始代码相同,只是在模板中进行了修饰。如果他在编译时知道w和h,那么他的原始代码可以使用任何你可以替代模板参数的东西。实际上,w/宽度和h/高度在编译时就知道了(如果我一开始不清楚的话,很抱歉)。我的想法是,我将在编译时知道某个特定对象的h和w值,但不是每个对象的h和w值都相同,因此我必须使用变量来表示大小。@Ben,建议一个OP没有想到的正确答案有什么错?我在OP更新问题之前写下了答案,以明确他需要不同h和w的多个版本的类。使用模板类确实是最好的解决方案。感谢您的同意,@Ben。但为了清楚起见,在OP澄清要求之前,我也写了我的回复。这就是为什么我在示例代码的开头加上“如果你在编译时知道
h
w
”。我确实知道数组在编译时的大小,但不是每个对象都一样,所以我不能使用常量变量。@Keand64:在这种情况下,你可以选择使用模板在编译时设置宽度和高度,就像马塞洛在回答中所展示的那样。这样做的代价是具有不同数组维度的对象具有不同的类型。您可能可以通过使用继承来解决这个问题,但它可能会变得混乱。