如何让类中的数组成员的大小在初始化时可以改变

时间:2022-08-05 09:54:53
下面的程序说明了我的问题:我想定义一个类,这个类有一个size成员,还有一个数组,而数组的大小是依据size来分配的。

class Test
{
public:
Test():size(5){};
const int size;
// int arr[size];如何让数组的大小在初始化时可以改变
};

程序编译时会出错。有没有什么办法啊?
PS:不要使用宏,我着实不喜欢宏。

17 个解决方案

#1


可用enum

#2



class Test
{
public:
    Test(){};
    enum{size = 5};
    int arr[size];
};

#3


看你这size是不是编译期常量了。。。

#4


改用vector

#5


动态的话就用vector吧,C++都实现好了。 自己写没必要。

#6


好吧,我刚好看到 CA2W 这个类的实现,就看到了如何动态确定数组大小的。
不过要用到模板:
template <int TLength = 128>
class Cls
{
private:
  int arr[TLength];
};
之所以可以,是因为模板是静态编译时确定的。

#7


new 

长度长度长度长度长度

#8


不需要自己写,已有std::array
编译器还不支援就去找boost

#9


哎 为什么还用数组呢 试试vector

#10


enum确实不错,但是有类型上的问题。

#11


你的size在编译阶段是不知道值的,所以不符合数组的声明与定义方式。如果想坚持用数组的话,可以用动态开辟内存空间。int *iptr = new int[size];然后再初始化一下。当然你可以用STL中的容器啊,都是比数组好用的,就是比数组慢些。

#12


class Test
{
public:    
    Test():size(5){};
    const int size;
     int arr[];   //就这样不去指定不就行了,用的时候再指定长度。应该可以达到你想要的同样效果
};

#13


楼主能说明一下想要的是在编译期决定array的大小还是执行期吧
顺便再说一下编译器,大伙才能决定该用C++98或C++11的解法

#14


引用 5 楼 lile1234_show 的回复:
动态的话就用vector吧,C++都实现好了。 自己写没必要。

我不想使用不使用vector,第一是因为我实际写的是一个图像处理程序,用vector真心没有使用数组来得

引用 11 楼 ZLhy_ 的回复:
你的size在编译阶段是不知道值的,所以不符合数组的声明与定义方式。如果想坚持用数组的话,可以用动态开辟内存空间。int *iptr = new int[size];然后再初始化一下。当然你可以用STL中的容器啊,都是比数组好用的,就是比数组慢些。


我之前不想使用vector的确是处于效率的考虑,但是我的实际问题是这样的:
我写的是一个图像处理程序,对于每个像素,都会建立大小为5的结构体数组。由于数组的大小比较小,是不是使用vector与直接使用数组差别不大呢?
因为我知道,vector内部也是连续的,如果不停的pushback,当大小不够时会重新分配,但是我这边size是定的,可以在初始化vector时先确定大小,然后就可以避免重新分配造成的效率损失,我的想法对么?

#15


>我写的是一个图像处理程序
强烈推荐openCV2,对图像处理做了很多的优化
他的资料结构也是针对图像处理而设计的

>可以在初始化vector时先确定大小,然后就可以避免重新分配造成的效率损失
正确,vector的初始化你可以这样做
vector<type> A(640 * 480);

>如果不停的pushback,当大小不够时会重新分配
你对于push_back的猜测是正确的
空间不够的时候会重新分配一块更大的空间

#16


引用 6 楼 zhoujielunzhimi 的回复:
好吧,我刚好看到 CA2W 这个类的实现,就看到了如何动态确定数组大小的。
不过要用到模板:
template <int TLength = 128>
class Cls
{
private:
  int arr[TLength];
};
之所以可以,是因为模板是静态编译时确定的。


这个很长见识啊,谢谢了。这学期我写了好多模板代码,看到您的这个之后我试了试,发现原来模板的东西很多我都还不知道呢。受教了!!!

#17


引用 14 楼 thefutureisour 的回复:
引用 5 楼 lile1234_show 的回复:动态的话就用vector吧,C++都实现好了。 自己写没必要。
我不想使用不使用vector,第一是因为我实际写的是一个图像处理程序,用vector真心没有使用数组来得

引用 11 楼 ZLhy_ 的回复:你的size在编译阶段是不知道值的,所以不符合数组的声明与定义方式。如果想坚持用数组的话,可以用动态开辟内存空……


我看了15L的回答,我想我能说的也许就是那些了。说的很好,补充一下的是:STL中的容器慢的原因吧,这些都是泛型的产物,首先在静态编译阶段确定类型费时间,而且他这些容器是和迭代器配合起来使用的,这样子也会慢吧。数组则是和指针一起来用的,据说不是很靠谱的说法:在高阶编程语言里面,C/C++的数组与指针的配合使用或许是最快的访问内存的方式了。当然可能会有人说汇编或是机器语言更快的话,那就不是高阶语言的范畴了。

#1


可用enum

#2



class Test
{
public:
    Test(){};
    enum{size = 5};
    int arr[size];
};

#3


看你这size是不是编译期常量了。。。

#4


改用vector

#5


动态的话就用vector吧,C++都实现好了。 自己写没必要。

#6


好吧,我刚好看到 CA2W 这个类的实现,就看到了如何动态确定数组大小的。
不过要用到模板:
template <int TLength = 128>
class Cls
{
private:
  int arr[TLength];
};
之所以可以,是因为模板是静态编译时确定的。

#7


new 

长度长度长度长度长度

#8


不需要自己写,已有std::array
编译器还不支援就去找boost

#9


哎 为什么还用数组呢 试试vector

#10


enum确实不错,但是有类型上的问题。

#11


你的size在编译阶段是不知道值的,所以不符合数组的声明与定义方式。如果想坚持用数组的话,可以用动态开辟内存空间。int *iptr = new int[size];然后再初始化一下。当然你可以用STL中的容器啊,都是比数组好用的,就是比数组慢些。

#12


class Test
{
public:    
    Test():size(5){};
    const int size;
     int arr[];   //就这样不去指定不就行了,用的时候再指定长度。应该可以达到你想要的同样效果
};

#13


楼主能说明一下想要的是在编译期决定array的大小还是执行期吧
顺便再说一下编译器,大伙才能决定该用C++98或C++11的解法

#14


引用 5 楼 lile1234_show 的回复:
动态的话就用vector吧,C++都实现好了。 自己写没必要。

我不想使用不使用vector,第一是因为我实际写的是一个图像处理程序,用vector真心没有使用数组来得

引用 11 楼 ZLhy_ 的回复:
你的size在编译阶段是不知道值的,所以不符合数组的声明与定义方式。如果想坚持用数组的话,可以用动态开辟内存空间。int *iptr = new int[size];然后再初始化一下。当然你可以用STL中的容器啊,都是比数组好用的,就是比数组慢些。


我之前不想使用vector的确是处于效率的考虑,但是我的实际问题是这样的:
我写的是一个图像处理程序,对于每个像素,都会建立大小为5的结构体数组。由于数组的大小比较小,是不是使用vector与直接使用数组差别不大呢?
因为我知道,vector内部也是连续的,如果不停的pushback,当大小不够时会重新分配,但是我这边size是定的,可以在初始化vector时先确定大小,然后就可以避免重新分配造成的效率损失,我的想法对么?

#15


>我写的是一个图像处理程序
强烈推荐openCV2,对图像处理做了很多的优化
他的资料结构也是针对图像处理而设计的

>可以在初始化vector时先确定大小,然后就可以避免重新分配造成的效率损失
正确,vector的初始化你可以这样做
vector<type> A(640 * 480);

>如果不停的pushback,当大小不够时会重新分配
你对于push_back的猜测是正确的
空间不够的时候会重新分配一块更大的空间

#16


引用 6 楼 zhoujielunzhimi 的回复:
好吧,我刚好看到 CA2W 这个类的实现,就看到了如何动态确定数组大小的。
不过要用到模板:
template <int TLength = 128>
class Cls
{
private:
  int arr[TLength];
};
之所以可以,是因为模板是静态编译时确定的。


这个很长见识啊,谢谢了。这学期我写了好多模板代码,看到您的这个之后我试了试,发现原来模板的东西很多我都还不知道呢。受教了!!!

#17


引用 14 楼 thefutureisour 的回复:
引用 5 楼 lile1234_show 的回复:动态的话就用vector吧,C++都实现好了。 自己写没必要。
我不想使用不使用vector,第一是因为我实际写的是一个图像处理程序,用vector真心没有使用数组来得

引用 11 楼 ZLhy_ 的回复:你的size在编译阶段是不知道值的,所以不符合数组的声明与定义方式。如果想坚持用数组的话,可以用动态开辟内存空……


我看了15L的回答,我想我能说的也许就是那些了。说的很好,补充一下的是:STL中的容器慢的原因吧,这些都是泛型的产物,首先在静态编译阶段确定类型费时间,而且他这些容器是和迭代器配合起来使用的,这样子也会慢吧。数组则是和指针一起来用的,据说不是很靠谱的说法:在高阶编程语言里面,C/C++的数组与指针的配合使用或许是最快的访问内存的方式了。当然可能会有人说汇编或是机器语言更快的话,那就不是高阶语言的范畴了。