怎样获得保存在CArray中的结构体的指针?

awjx 2008-08-05 08:51:30
在程序初始化时将一批结构保存在一个CArray的变量中,
在程序的另一处需要得到其中某个结构的指针,
不仅要取它的内容,而且要修改它的内容。
所以我想得到指针后,通过该指针就可以修改它的内容,理论上应该没问题吧,可是...

部分代码如下:
//结构体
struct A
{
int a;
int b;
};

//程序初始化
struct A sA;
sA.a = 1;
sA.b = 2;
...
//(定义一批)
...

//定义一个数组变量
CArray<A,A> arrA;
arrA.Add(sA);
...

//希望通过一个函数得到一个结构的指针(注意,一定是指针,不是值)
void GetStr(A* aA)
{
aA = &arrA.GetAt(10);
}

//我希望通过GetStr来得到指针,并改变结构体的内容。
struct A* aa = NULL;
GetStr(aa);
//
//指针得到了,我应该可以修改这个结构体的值了吧
aa->a = 100;

//可是好像不行啊,

请教!
谢谢
...全文
326 30 打赏 收藏 转发到动态 举报
写回复
用AI写文章
30 条回复
切换为时间正序
请发表友善的回复…
发表回复
haosuai 2008-08-05
  • 打赏
  • 举报
回复
刚截了图,不知道怎么传上来。好像不支持上传
haosuai 2008-08-05
  • 打赏
  • 举报
回复
[Quote=引用 21 楼 awjx 的回复:]
TYPE& GetAt(
INT_PTR nIndex
);
const TYPE& GetAt(
INT_PTR nIndex
) const;


还是把程序该下把,这样经过GetStr是没有作用的,
struct A * aa = NULL;
aa = GetStr();//
aa->a = 100;
把GetStr()该为A *GetStr()
{
return &arrA.GetAt(10);
}
就可

---------------------
我都试过啦,还是没修改结构体的值
[/Quote]

我自己又在VC6.0下面试了下,可以改变的
veloting 2008-08-05
  • 打赏
  • 举报
回复
[Quote=引用 21 楼 awjx 的回复:]
TYPE& GetAt(
INT_PTR nIndex
);
const TYPE& GetAt(
INT_PTR nIndex
) const;


还是把程序该下把,这样经过GetStr是没有作用的,
struct A * aa = NULL;
aa = GetStr();//
aa->a = 100;
把GetStr()该为A *GetStr()
{
return &arrA.GetAt(10);
}
就可

---------------------
我都试过啦,还是没修改结构体的值
[/Quote]

#include <iostream>
#include <vector>

using namespace std;

struct A
{
int a;
int b;
};

A* GetStr(vector<A> &ivec)
{
return &ivec.at(0);
};

int main()
{
A temp;
temp.a = 1;
temp.b = 2;

vector<A> ivec;
ivec.push_back(temp);

A *temp2 = GetStr(ivec);
cout << temp2->a << temp2->b << endl;//返回12

getchar();
return 0;
}

我用vector做的,返回的是指针,可以看到指针指向了temp
hai040 2008-08-05
  • 打赏
  • 举报
回复
arrA.GetAt(10).a = 100;不行吗?
为什么非要指针?
如果是另一个函数接受指针,直接传&arrA.GetAt(10)就行
为什么非要用函数去取指针?
e_sharp 2008-08-05
  • 打赏
  • 举报
回复
如果是c,就用A**
如果用c++,推荐使用引用A&,好理解
e_sharp 2008-08-05
  • 打赏
  • 举报
回复
void GetStr(A** aA) { //函数内改变传递来的指针,用A**
*aA = &arrA.GetAt(1);
}

int main() {
A* test = NULL;
GetStr(&test);
test->a = 10;
test->b = 11;
}

xkyx_cn 2008-08-05
  • 打赏
  • 举报
回复
类内部的数据应该调用相应的接口来修改,而不是通过获取其指针后再来修改

[Quote=引用 23 楼 awjx 的回复:]
需要再调用一下SetAt即可:
---------------
不是这样的,开始这样,那因为我没有直接return &arrA.GetAt(10);
而是中间多了一个变量,
现在可以了,
但我还是没搞明白下面两种原形的区别
TYPE& GetAt(
INT_PTR nIndex
);

void GetAt(TYPE& aa,INT_PTR nIndex );


另:
前面有人说这违返了封装性原则,有吗?
[/Quote]
awjx 2008-08-05
  • 打赏
  • 举报
回复
需要再调用一下SetAt即可:
---------------
不是这样的,开始这样,那因为我没有直接return &arrA.GetAt(10);
而是中间多了一个变量,
现在可以了,
但我还是没搞明白下面两种原形的区别
TYPE& GetAt(
INT_PTR nIndex
);

void GetAt(TYPE& aa,INT_PTR nIndex );


另:
前面有人说这违返了封装性原则,有吗?
xkyx_cn 2008-08-05
  • 打赏
  • 举报
回复
需要再调用一下SetAt即可:

int i = 10;
struct A aa = arrA.GetAt(i);
aa.a = 100;
arrA.SetAt(i, aa);


[Quote=引用 21 楼 awjx 的回复:]
TYPE& GetAt(
INT_PTR nIndex
);
const TYPE& GetAt(
INT_PTR nIndex
) const;


还是把程序该下把,这样经过GetStr是没有作用的,
struct A * aa = NULL;
aa = GetStr();//
aa->a = 100;
把GetStr()该为A *GetStr()
{
return &arrA.GetAt(10);
}
就可

---------------------
我都试过啦,还是没修改结构体的值
[/Quote]
awjx 2008-08-05
  • 打赏
  • 举报
回复
TYPE& GetAt(
INT_PTR nIndex
);
const TYPE& GetAt(
INT_PTR nIndex
) const;



还是把程序该下把,这样经过GetStr是没有作用的,
struct A * aa = NULL;
aa = GetStr();//
aa->a = 100;
把GetStr()该为A *GetStr()
{
return &arrA.GetAt(10);
}
就可

---------------------
我都试过啦,还是没修改结构体的值
Kenny_Glacier 2008-08-05
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 awjx 的回复:]
引用 16 楼 hai040 的回复:
CArray应该跟vector差不多,指针很难保证有效


不是吧,那一定要保证有效啊。
[/Quote]
保证有效是你自己的事情
只能是在你获得了指针之后,再进行判断
比如
A* GetStr(CArray <A,A> *arrA)
{
return aA = &arrA.GetAt(10);
}
然后这样调用
if(GetStr(XXXXXX)==NULL)
{
无效
}
else
{
......
}
或者你可以返回一个索引,然后查看索引的范围等等
awjx 2008-08-05
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 hai040 的回复:]
CArray应该跟vector差不多,指针很难保证有效
[/Quote]

不是吧,那一定要保证有效啊。
haosuai 2008-08-05
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 wjb_yd 的回复:]
void GetStr(A* aA)
{
aA = &arrA.GetAt(10);
}
这样之后,aA的值,不会改变的
[/Quote]
还是把程序该下把,这样经过GetStr是没有作用的,
struct A * aa = NULL;
aa = GetStr();//
aa->a = 100;
把GetStr()该为A *GetStr()
{
return &arrA.GetAt(10);
}
就可以啦
guzhilei1986 2008-08-05
  • 打赏
  • 举报
回复
学习
hai040 2008-08-05
  • 打赏
  • 举报
回复
CArray应该跟vector差不多,指针很难保证有效
wjb_yd 2008-08-05
  • 打赏
  • 举报
回复
void GetStr(A*& aA)
xkyx_cn 2008-08-05
  • 打赏
  • 举报
回复
lz说说为啥一定要用指针来操作?

[Quote=引用 12 楼 awjx 的回复:]
A* GetStr(CArray <A,A> *arrA)
{
return aA = &arrA.GetAt(10);
}
不习惯这段代码,因为我还得知道GetStr是否成功,我的函数原形是这样的
bool GetStr(struct A* aa);
所以我把返回值做了是否获取成功的标志了。
如果直接返回地址,当然也可以通过地址是否为空来判断是否成功。
但直接返回地址,是正确的做法吗?
[/Quote]
wjb_yd 2008-08-05
  • 打赏
  • 举报
回复
void GetStr(A* aA)
{
aA = &arrA.GetAt(10);
}
这样之后,aA的值,不会改变的
awjx 2008-08-05
  • 打赏
  • 举报
回复
A* GetStr(CArray<A,A> *arrA)
{
return aA = &arrA.GetAt(10);
}
不习惯这段代码,因为我还得知道GetStr是否成功,我的函数原形是这样的
bool GetStr(struct A* aa);
所以我把返回值做了是否获取成功的标志了。
如果直接返回地址,当然也可以通过地址是否为空来判断是否成功。
但直接返回地址,是正确的做法吗?
babyvox1999 2008-08-05
  • 打赏
  • 举报
回复
返回指针或者使用指针的指针作参数
加载更多回复(10)

64,648

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧