智能指针如何强制类型转换?

zhangwuji154 2010-03-08 02:38:03
#include <iostream.h>
#include <string>
#include <memory>
#include <vector>
typedef struct TLocalParameterData{
//局部坐标系名称
string strName;
//对应的全局坐标系
string strCounterpart;
//是否是4参数
bool Is4Paras;
double X;
double Y;
double dK;
double Ez; //εz
}TLoc4ParasData;

struct TLoc7ParasData : TLocalParameterData{
double Z;
double Ex;
double Ey;
};
int main(int argc, char *argv[])
{
//普通指针
TLocalParameterData* p[10];
TLoc7ParasData a;
a.strName = "aaaa";
a.Z = 999;
p[0] = (TLocalParameterData*)&a;
cout<<((TLoc7ParasData*)p[0])->Z<<endl;



//智能指针
std::vector<std::auto_ptr<TLocalParameterData> > pSL;
std::auto_ptr<TLoc7ParasData> pL(new TLoc7ParasData);
pL->strName = "bbb";
pSL.push_back((std::auto_ptr<TLocalParameterData>)pL);
cout<<pSL[0]->strName<<endl;
return 0;
}
...全文
827 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
harpe1999 2010-03-08
  • 打赏
  • 举报
回复
同意pengzhixi,
冻结 2010-03-08
  • 打赏
  • 举报
回复
学标准c++就不要VC6了。
VC6据说只支持80%左右的标准c++。
而且支持的很诡异。

标准c++1998年制定。
VC6也是1998年出的。

taodm 2010-03-08
  • 打赏
  • 举报
回复
楼主,请珍惜生命,远离VC6.
你问的为什么可以,只不过是负负得正的巧合。
yshuise 2010-03-08
  • 打赏
  • 举报
回复
引用 10 楼 zhangwuji154 的回复:
这个是VC6的,为什么就可以?

这个编译器太古老了,对标准支持不好。
pengzhixi 2010-03-08
  • 打赏
  • 举报
回复
请使用share_ptr这个智能指针。另外你想把auto_ptr<TLoc7ParasData>push到一个vector <std::auto_ptr <TLocalParameterData> > pSL这样的容器里面是没可能的,因为auto_ptr<TLoc7ParasData>和auto_ptr <TLocalParameterData>不存在继承关系。
zhangwuji154 2010-03-08
  • 打赏
  • 举报
回复
这个是VC6的,为什么就可以?
yshuise 2010-03-08
  • 打赏
  • 举报
回复
引用 4 楼 zhangwuji154 的回复:
引用 2 楼 yshuise 的回复:
auto_ptr不能用于容器。
用boost::shared_ptr,先!
唯一的办法吗?那不还得下那个库,多麻烦呀

我看了一下你的数据结构,可以直接拷贝,当然更耗了点资源。
zhangwuji154 2010-03-08
  • 打赏
  • 举报
回复
引用 5 楼 freezezdj 的回复:
auto_ptr在复制的话,控制权会转移,
所以c++不允许 auto_ptr 用于容器。
你用的话,编译器会报错的。
void CPointerDlg::OnButton3() 
{
// TODO: Add your control notification handler code here
/*
上面(OnButton2)那个
std::auto_ptr<int> s[10];
不是还得要写个10吗,不动态,那就用下面这个
*/
std::vector<std::auto_ptr<int> > s;
for (int i=0; i<10; i++)
{
//std::auto_ptr<int> p(new int(i));
s.push_back(std::auto_ptr<int>(new int(i)));
}
CString strTemp, strResult;

for (i=0; i<10; i++)
{
strTemp.Format(_T("%d, "), *s[i]);
strResult += strTemp;
}

GetDlgItem(IDC_STATIC_TEXT)->SetWindowText(strResult);
}
zhangwuji154 2010-03-08
  • 打赏
  • 举报
回复
郁闷了
std::vector<std::auto_ptr<TLocalParameterData> > pSL;
std::auto_ptr<TLocalParameterData> p4;

pSL.push_back(p4);
原来是push_back的问题,这样都出错
yshuise 2010-03-08
  • 打赏
  • 举报
回复
先用正确的方式。一开始就是错误,后面没有研究价值。
冻结 2010-03-08
  • 打赏
  • 举报
回复
auto_ptr在复制的话,控制权会转移,
所以c++不允许 auto_ptr 用于容器。
你用的话,编译器会报错的。
zhangwuji154 2010-03-08
  • 打赏
  • 举报
回复
引用 2 楼 yshuise 的回复:
auto_ptr不能用于容器。
用boost::shared_ptr,先!

唯一的办法吗?那不还得下那个库,多麻烦呀
zhangwuji154 2010-03-08
  • 打赏
  • 举报
回复
但是,智能指针,我还是定义了一个指针数组
std::vector<std::auto_ptr<TLocalParameterData> > pSL;
又定义该类型指针、赋值
std::auto_ptr<TLoc7ParasData> pL(new TLoc7ParasData);
pL->strName = "bbb";
但却无法放进这个动态数组里
pSL.push_back((std::auto_ptr<TLocalParameterData>)pL);



怎么办?
yshuise 2010-03-08
  • 打赏
  • 举报
回复
auto_ptr不能用于容器。
用boost::shared_ptr,先!
zhangwuji154 2010-03-08
  • 打赏
  • 举报
回复
我定义了两个结构体,还是继承关系
我定义了一个包含 TLocalParameterData类型指针的数组p[10];
TLocalParameterData* p[10];

然后定义了一个TLoc7ParasData 类型的a,并赋值
TLoc7ParasData a;
a.strName = "aaaa";
a.Z = 999;
然后把a的地址放到p这个数组里,直接放肯定是不行的,但是通过强制类型转换,就可以实现
p[0] = (TLocalParameterData*)&a;
然后,读出来,还是没有问题的
cout<<((TLoc7ParasData*)p[0])->Z<<endl;

64,654

社区成员

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

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