如何定义CArray动态数组?我想在头文件中定义动态数组为什么不可以,因为我想把它传递到另一个类中?
5个回答
展开全部
template <class TYPE, class ARG_TYPE> 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 <afxtempl.h>
用法
CArray <CPoint,CPoint&> 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<size;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 <afxtempl.h>
用法
CArray <CPoint,CPoint&> 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<size;i++)
{
pt=m_Array.GetAt(i);
dc.LineTo(pt);
}
追问
你这个我看到过,我只是想在另外一个类中使用它,但是发现不行。
追答
报什么错?应该是可以的
展开全部
你如果想定义动态数组,你干脆定义一个单链表得了。你还可以定义这个:
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模版使用的策略。注意,在头文件中只是声明,不是定义,要在源文件中定义。你只需包含头文件就可以了。
追问
在头文件中如何声明呢?
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
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| 评论
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
typedef CArray <BaseClass *,BaseClass *> 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);
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而获取其指针
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
你加了使用CArray的头文件了吗
追问
#include
是这个吗?加了,可以使用,只是不知道如何传递这个数组到另一个类。
追答
CArray & iArray;这样定义的?
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询