CArray问题,高手看看,实在不会。解决给分。

海子0011 2009-06-14 09:04:34
问题:
1,vc里如何在函数中把CArray<CString,CString>做为返回值呢,
2,别的函数如何调用这种返回值的函数呢
比如:
CArray<CString,CString>myArray;//声明类型。
myArray& getValue()
{
myArray str;
.......
.
return str;//直接返回str好象不行。

但别的函数如何调用getValue();呢
比如:
CArray<CString,CString>myArray;
myArray mm = getValue();//不行的。我改为:
myArray mm;
mm.Copy(getValue());//老提示严重错误
高手帮助下。解决给分。
...全文
473 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
我觉得你还是别想太多了,直接用全局变量比较合适。
DavidHsing 2009-06-14
  • 打赏
  • 举报
回复
解决方案:
1、用全局的 CStringArray 或 CArray<CString,CString>,个人觉得这个似乎前面的更方便一些;
2、用传引用代替传值。这样既可以达到返回 CStringArray 或 CArray<CString,CString> 的目的,又可以避免对象拷贝,提高运行效率。示例:

//调用的地方
CStringArray arMyArray;
CallMyFunc(arMyArray);

//函数体
BOOL CallMyFunc(CStringArray& ar)
{
ar.Add(_T("haidejintou"));
ar.Add(_T("海的尽头"));
//你其他的检查代码

return TRUE;
}
海子0011 2009-06-14
  • 打赏
  • 举报
回复
1,2,3,6,8楼正解释。
4,7楼正解(最经典的解决办法);
海子0011 2009-06-14
  • 打赏
  • 举报
回复
5楼正解。
littlefish636 2009-06-14
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 zhihuizhilv 的回复:]
MFC里面有一个CStringArray,可以直接使用。
[/Quote]

使用CStringArray就行了...
zhihuizhilv 2009-06-14
  • 打赏
  • 举报
回复
不能直接返回,可以考虑使用输出参数。
void getValue(CStringArray & strArr)
{
...
zhihuizhilv 2009-06-14
  • 打赏
  • 举报
回复
MFC里面有一个CStringArray,可以直接使用。
zhihuizhilv 2009-06-14
  • 打赏
  • 举报
回复
你的代码有几个错误:
CArray <CString,CString>myArray;//声明类型。
myArray& getValue()
{
myArray str;
...


返回类型怎么是一个变量名呢?
应该这样吧:
typedef CArray <CString,CString> myArray;

另外,返回一个局部变量的引用,绝对是不可以的,函数返回之后,对象就被释放了,那么它的引用也是无效的。运行时肯定出错。
oyljerry 2009-06-14
  • 打赏
  • 举报
回复
CArray <CString,CString> 作为函数参数,用引用的方式,函数中修改, 函数调用完了就可以读取这个参数值
fun(CArray <CString,CString>& array, ...)
一笑拔剑 2009-06-14
  • 打赏
  • 举报
回复
做成两个 全局变量

然后在过程里修改么
百事烟 2009-06-14
  • 打赏
  • 举报
回复
CStringList 很好用,还能串行化
allright1199 2009-06-14
  • 打赏
  • 举报
回复
要不直接声明为全局变量……
海子0011 2009-06-14
  • 打赏
  • 举报
回复
谢谢所以的解答。
分太少。大家别见怪。
海子0011 2009-06-14
  • 打赏
  • 举报
回复
需要你代码中这种返回引用的方式的唯一场景是类成员变量是个array,你需要返回一个array的引用。如果这是一个临时产生的array,这自然是不可用引用作为返回类型的(这不特殊于你这个问题,而是所有的临时变量都不能返回引用)
高见。
arong1234 2009-06-14
  • 打赏
  • 举报
回复
首先我不赞同使用全局变量的方法,这只是你没有找到正确方法的情况下的变通方法,不是好的解决方法。如果有可能,应该尽量避免全局变量

你的问题在于:你不应该用它做返回值,而应该把他作为引用型的参数。直接返回数组变量在任何时候都不是好主意,因为这涉及到大量的拷贝
正确的用法应该是:

void getValue(myArray& array)
{
.....
}

调用者使用的方法是:

myArray anArray;
getValue(anArray);

需要你代码中这种返回引用的方式的唯一场景是类成员变量是个array,你需要返回一个array的引用。如果这是一个临时产生的array,这自然是不可用引用作为返回类型的(这不特殊于你这个问题,而是所有的临时变量都不能返回引用)


[Quote=引用楼主 haidejintou 的帖子:]
问题:
1,vc里如何在函数中把CArray <CString,CString>做为返回值呢,
2,别的函数如何调用这种返回值的函数呢
比如:
CArray <CString,CString>myArray;//声明类型。
myArray& getValue()
{
myArray str;
.......
.
return str;//直接返回str好象不行。

但别的函数如何调用getValue();呢
比如:
CArray <CString,CString>myArray;
myArray mm = getValue();//不行的。我改为:
myArray mm;

[/Quote]

16,467

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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