C++怎么在结构体里定义动态数组

请问:1.C++可否在结构体定义的时候建立动态数组;2.C++可否在主函数中定义结构体的动态数组。分别对这两种情况写了两段代码,但是都有问题。
1:

struct Range
{
float *min=new float[c];
float *max=new float[c];
};
struct Gcell
{
int iNum;
Range ran;
};
void main()
{
int c=4;
Gcell *Cell=new Gcell[J];
}
2:
struct Range
{
float min,max;
};
struct Gcell
{
int iNum;
Range ran;
};

void main()
{
int i,c=4,J=50;
Gcell *Cell=new Gcell[J];
for(i=0;i<J;i++)
{
float *Cell[i].ran.min=new float[10];
}
}

可以在结构体中添加指针类成员变量,并在成员函数中实现动态数组的分配。

以下以一个仅实现整型动态数组,不包含其它功能的类为例做说明。

class array //类名
{
    public:
        int *v; //动态数组首地址。
        int length; //动态数组长度。
        array(int len)
        {
            
            if(len <= 0)//初始化长度非法。
            {
                length = 0;
                v = NULL; 
            }
            else
            {
                length = len;
                v = new int[length];//内存分配。
            }
        }
        ~array()
        {
            delete [] v;//析构中释放内存。
        }
};
温馨提示:内容为网友见解,仅供参考
第1个回答  推荐于2017-12-15
首先,第一种情况不会出现 ,所谓结构体可以理解为一种特殊的,默认内部public的,并且不写方法和函数的类,当然你写方法也可以编译的,所以他就是一个类,而如果是数组在结构体中,那么指挥定义一个指针,而不会定义成实例数组,用的时候外部new,所以第一种情况会写成类,然后在构造函数里面new,析构里面delete
第二,是可以的,你写错的原因应该是在for'里面,因为你的结构体都是系统的类型,不是指针,是可以直接new得到,也就是说,你在new Gcell的时候就已经完全搞定了,不需要for,如果是想要修改的话,应该是(*Cell[i]).ran.min=123;这样,而不是再new追问

您好,不知道我是否理解了您的意思,主函数部分修改成下面这个样子,但运行还是报错:
int main()
{
int i,c=4,J=50;
Gcell *Cell=new Gcell[J];
for(i=0;i<J;i++)
{
Cell[i].ran.min=new float[c];
}
}

追答

不要new,直接等于c就可以了,他已经帮你new好了,在newGcell的时候就已经搞定了,因为他内部不是指针类型,顺带给你解释下上面仁兄的东西template 是模板,他的作用就是编译前自动生成代码,而不是运行时,所以你后面问的能不能c=4,然后 cell《c》是不可以的,模板传递过去的必须是一个常量或者一种类型,他并不能实现运行时候动态, 这里写4,那么编译的时候就是4,
模板具体用法你可以查百度,会比我说的详细

追问

您好,您说的应该具体怎么改?我把new删了还是不对,直接用也不行。您可否帮我简单的写一下?
结构体定义同问题2.主函数如下,调试出错
int main()
{
int i,c=4,J=50;
Gcell *Cell=new Gcell[J];
for(i=0;i<J;i++)
{
Cell[i].ran.min[c]=i;//new float[c];
}
}

追答struct Range
{
   double min,max;//这里用了double,因为int有些编译器币float大,会数据丢失的警告,不改也可以用
};
struct Gcell
{
   int iNum;
   Range ran;
};

void main()
{
   int i,J=10;
   Gcell *Cell=new Gcell[J];
   for(i=0;i<J;i++)
   {
       Cell[i].ran.min=i;//直接这么赋值就可以了,不需要定义啊,new啊什么的,可以直接用的
       Cell[i].ran.max=J+i;
   }
   for(i=0;i<J;i++)
   {
       cout<<"cell["<<i<<"].ran.max:"<<Cell[i].ran.max;//输出也是一样
       cout<<"\tmin:"<<Cell[i].ran.min<<endl;
   }
    delete[] Cell;//差点忘了了,要养成好习惯,new了要del
}

追问

哦~~可能是我没有表述清楚,我的意思是对于min、max再建立一个动态数组,调用时相当于这样的形式:cell[i].ran.max[j],cell[i].ran.min[j]

追答

学过类吗?用类来写,逻辑更好,没有只能这么改

struct Range
{
   double *min,*max;
};
//然后
int c=10;
Cell[i].ran.min= new double[c];//赋值
cout<<Cell[i].ran.min[j];//这样调用,

本回答被提问者采纳
第2个回答  2014-01-04
template <std::size_t c>
struct Range{ float min[c]; float max[c];};
template <std::size_t c>
struct Gcell{ int iNum; Range<c> ran;};

int main(){ Gcell<4> *Cell=new Gcell<4>[J];}追问

    template <std::size_t c> 这句是什么意思?

    主函数中Gcell<4> *Cell=new Gcell<4>[J],可否改成int c=4;Gcell<c>*Cell=new Gcell<c>[J]

    您的程序运行的时候有点问题还

追答

要在定义时固定数组长度就用上述代码,要动态决定数组长度就用
std::vector min;
std::vector max;
调用resize方法改变长度。要用main中的变量决定成员的初始长度的话,必须把变量传给Range的构造函数。

代码是在你提供的第一段代码的基础上改的,我自信不会引入新的错误

追问

感谢您的耐心解答。我对vector的用法不是很了解,大概查了一下也没太明白。按您的程序改成动态的话整体程序应该是什么样子的?谢谢您了

相似回答