如何定义CArray动态数组?我想在头文件中定义动态数组为什么不可以,因为我想把它传递到另一个类中?
答案:5 悬赏:50 手机版
解决时间 2021-02-06 00:04
- 提问者网友:抽煙菂渘情少年
- 2021-02-05 19:06
如何定义CArray动态数组?我想在头文件中定义动态数组为什么不可以,因为我想把它传递到另一个类中?
最佳答案
- 五星知识达人网友:鸽屿
- 2021-02-05 19:28
typedef CArray CBasePtrArr;///定义类型
CBasePtrArr m_pBaseArr;//定义变量
BaseClass *pbc = new BaseClass;//动态创建变量
m_pBaseArr.Add(pba);///加入库中
BaseClass *pbc1 = m_pBaseArr.GetAt(0);///从库中提取元素
void PassArray(CBasePtrArr &bpa)//传递引用参数
{
BaseClass *pbc2 = m_pBaseArr.GetAt(0);
}
////删除元素
delete pBaseArr[2];
pBaseArr.RemoveAt(2);追问谢谢,这个从库中提取元素,是只能提取一个吗?追答一般是,当然也可以通过GetData而获取其指针追问传递引用参数这里不明白,麻烦说下是怎么传递的,具体该如何操作,谢谢,追答传递引用参数的好处是,参数不用重构,而直接传递参数的地址,而且可以直接修改
具体形式:
void PassArray(CBasePtrArr &bpa)//传递引用参数
void PassArray(CBasePtrArr bpa)//传递值参数
//记得给分哦
CBasePtrArr m_pBaseArr;//定义变量
BaseClass *pbc = new BaseClass;//动态创建变量
m_pBaseArr.Add(pba);///加入库中
BaseClass *pbc1 = m_pBaseArr.GetAt(0);///从库中提取元素
void PassArray(CBasePtrArr &bpa)//传递引用参数
{
BaseClass *pbc2 = m_pBaseArr.GetAt(0);
}
////删除元素
delete pBaseArr[2];
pBaseArr.RemoveAt(2);追问谢谢,这个从库中提取元素,是只能提取一个吗?追答一般是,当然也可以通过GetData而获取其指针追问传递引用参数这里不明白,麻烦说下是怎么传递的,具体该如何操作,谢谢,追答传递引用参数的好处是,参数不用重构,而直接传递参数的地址,而且可以直接修改
具体形式:
void PassArray(CBasePtrArr &bpa)//传递引用参数
void PassArray(CBasePtrArr bpa)//传递值参数
//记得给分哦
全部回答
- 1楼网友:大漠
- 2021-02-05 23:14
a[5]数组中 5表示a数组中有5个元素,分别是a[0],a[1],a[2],a[3],a[4].
在sum=a[0]+a[1]+a[2]+a[3]+a[4]+a[5] 公式中严格的讲
将会出现‘下标越界’或‘上标越界’的错误(在不同的语言中数组的开始时不一样的!例如:c是 0开始;basic是1开始的!)!但是分在什么里面运行里!
而a[5]的值到底是多少呢?
就要知道,这个数组是如何在内存中存储的了!
数组如何在内存中存储,就要知道,数组是什么类型的?
不同的类型占用不同内存的大小!
例如: 地址:&1205 存储的 是a[4]的值,数组a是一个整形!
那a中的每一个元素占用的内存大小就是4字节,那么总共开辟的空间便是20字节的内存大小!
a[5]就是这20字节内存中,后面的4字节中得值。
a数组后面的4字节的值是多少呢?
谁也不知道?
只有内存知道!嘿嘿!
所以a[5]是一个不可预料的值!赞同4| 评论
在sum=a[0]+a[1]+a[2]+a[3]+a[4]+a[5] 公式中严格的讲
将会出现‘下标越界’或‘上标越界’的错误(在不同的语言中数组的开始时不一样的!例如:c是 0开始;basic是1开始的!)!但是分在什么里面运行里!
而a[5]的值到底是多少呢?
就要知道,这个数组是如何在内存中存储的了!
数组如何在内存中存储,就要知道,数组是什么类型的?
不同的类型占用不同内存的大小!
例如: 地址:&1205 存储的 是a[4]的值,数组a是一个整形!
那a中的每一个元素占用的内存大小就是4字节,那么总共开辟的空间便是20字节的内存大小!
a[5]就是这20字节内存中,后面的4字节中得值。
a数组后面的4字节的值是多少呢?
谁也不知道?
只有内存知道!嘿嘿!
所以a[5]是一个不可预料的值!赞同4| 评论
- 2楼网友:痴妹与他
- 2021-02-05 22:25
你加了使用CArray的头文件了吗追问#include
是这个吗?加了,可以使用,只是不知道如何传递这个数组到另一个类。追答CArray& iArray;这样定义的?
是这个吗?加了,可以使用,只是不知道如何传递这个数组到另一个类。追答CArray
- 3楼网友:孤老序
- 2021-02-05 20:52
你如果想定义动态数组,你干脆定义一个单链表得了。你还可以定义这个:
class CArray
{
public:/ private:
char/int/float... *pdata;
public:
CArray(const int n){ pdata= new char/int/float... [n];}
...
};
在构造函数中让用户选择数组的元素个数,参数必须是常量,然后动态分配一个存有n个元素的数组,然后把第一个元素赋给pdata。如果你想修改数组元素个数,可以把pdata指向的数组里的所有元素存储起来,比如赋给int/char/float... *a,然后再用new运算符分配一个n个元素的数组给pdata,然后拷贝a的所有元素给pdata,然后用delete[] a把a指向的内存释放了。这是vector模版使用的策略。注意,在头文件中只是声明,不是定义,要在源文件中定义。你只需包含头文件就可以了。追问在头文件中如何声明呢?
class CArray
{
public:/ private:
char/int/float... *pdata;
public:
CArray(const int n){ pdata= new char/int/float... [n];}
...
};
在构造函数中让用户选择数组的元素个数,参数必须是常量,然后动态分配一个存有n个元素的数组,然后把第一个元素赋给pdata。如果你想修改数组元素个数,可以把pdata指向的数组里的所有元素存储起来,比如赋给int/char/float... *a,然后再用new运算符分配一个n个元素的数组给pdata,然后拷贝a的所有元素给pdata,然后用delete[] a把a指向的内存释放了。这是vector模版使用的策略。注意,在头文件中只是声明,不是定义,要在源文件中定义。你只需包含头文件就可以了。追问在头文件中如何声明呢?
- 4楼网友:动情书生
- 2021-02-05 20:17
template class CArray : public
CObject
参数:
TYPE
模板参数指定存储在数组中的对象的类型。TYPE是一个由CArray返回的参数。
ARG_TYPE
模板参数指定用于访问存储在数组中对象的参数类型。通常是一个对TYPE的参考。ARG_TYPE是一个传递给CArray的参数。
说明:
CArray类支持与CArray相似的数组,但是必要时可以动态压缩并扩展。数组索引从0开始。可以决定是固定数组上界还是允许当添加元素时扩展当前的边界。内存对上界是连续地分配空间,甚至一些元素可为空。
和CArray一样,CArray索引元素的访问时间是不变的,与数组大小无关。
提示:
在使用一个数组之前,使用SetSize建立它的大小和为它分配内存。如果不使用SetSize,则为数组添加元素就会引起频繁地重新分配和拷贝。频繁地重新分配和拷贝不但没有效率,而且导致内存碎片。
如果需要一堆数组中的个别数据,必须设置CDumpContext对象的深度为1或更大。
此类的某成员函数调用全局帮助函数,它必须为CArray的大多数使用而定制。请参阅宏和全局量部分中的“类收集帮助器”。
当从一个CArray对象中移去元素时,帮助函数DestructElements被调用。
当添加元素时,帮助函数ConstructElements被调用。
数组类的派生与列表的派生相似。
如果要了解关于使用CArray的更多信息,请参阅联机文档“Visual
C++程序员指南”中的“收集”。
请记住:使用CArray一定要包含头文件afxtempl.h。
#include
用法
CArray m_Array;
m_Array.SetSize(10,10);
CPoint pt1(10,10);
m_Array.Add(pt1);
CPoint pt2(10,50);
m_Array.Add(pt2);
CPoint pt3(10,100);
m_Array.Add(pt3);
int size=m_Array.GetSize();
CClientDC dc(this);
dc.MoveTo(0,0);
CPoint pt;
for(int i=0;i {
pt=m_Array.GetAt(i);
dc.LineTo(pt);
}追问你这个我看到过,我只是想在另外一个类中使用它,但是发现不行。追答报什么错?应该是可以的
CObject
参数:
TYPE
模板参数指定存储在数组中的对象的类型。TYPE是一个由CArray返回的参数。
ARG_TYPE
模板参数指定用于访问存储在数组中对象的参数类型。通常是一个对TYPE的参考。ARG_TYPE是一个传递给CArray的参数。
说明:
CArray类支持与CArray相似的数组,但是必要时可以动态压缩并扩展。数组索引从0开始。可以决定是固定数组上界还是允许当添加元素时扩展当前的边界。内存对上界是连续地分配空间,甚至一些元素可为空。
和CArray一样,CArray索引元素的访问时间是不变的,与数组大小无关。
提示:
在使用一个数组之前,使用SetSize建立它的大小和为它分配内存。如果不使用SetSize,则为数组添加元素就会引起频繁地重新分配和拷贝。频繁地重新分配和拷贝不但没有效率,而且导致内存碎片。
如果需要一堆数组中的个别数据,必须设置CDumpContext对象的深度为1或更大。
此类的某成员函数调用全局帮助函数,它必须为CArray的大多数使用而定制。请参阅宏和全局量部分中的“类收集帮助器”。
当从一个CArray对象中移去元素时,帮助函数DestructElements被调用。
当添加元素时,帮助函数ConstructElements被调用。
数组类的派生与列表的派生相似。
如果要了解关于使用CArray的更多信息,请参阅联机文档“Visual
C++程序员指南”中的“收集”。
请记住:使用CArray一定要包含头文件afxtempl.h。
#include
用法
CArray
m_Array.SetSize(10,10);
CPoint pt1(10,10);
m_Array.Add(pt1);
CPoint pt2(10,50);
m_Array.Add(pt2);
CPoint pt3(10,100);
m_Array.Add(pt3);
int size=m_Array.GetSize();
CClientDC dc(this);
dc.MoveTo(0,0);
CPoint pt;
for(int i=0;i
pt=m_Array.GetAt(i);
dc.LineTo(pt);
}追问你这个我看到过,我只是想在另外一个类中使用它,但是发现不行。追答报什么错?应该是可以的
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯