好的,我有像这样的结构
typedef struct
{
float x;
float y;
char name[];
} pTip;
另一个结构
typdef struct
{
float xx;
float yy;
pTip *tip;
}finalTip;
我创建并填充map<string, pTip>
地图
工作正常。 我现在正在尝试生成finalTips的矢量
我做:
map<string, pTip>::const_iterator iter = maps.find(p_name);
所以它很好用我的迭代器现在有我需要的东西,我可以用
提取信息(iter->second).x
但是我想现在使用那个迭代器将它保存在我的finalTip struc obj final中 所以我试过了:
finalTip final;
final.tip = iter->second;
对于这种情况,我收到错误:
错误:无法在赋值
中将'const pTip'转换为'pTip *'所以我修复了:
*final.tip = iter->second;
这是正确的解决方法还是我做错了。 这似乎有效,但我想确保我做得对
答案 0 :(得分:4)
你想要
final.tip = &iter->second;
由于iter
是map<string, pTip>
迭代器,iter->second
是对pTip的引用。带上&amp;的地址获得一个指针。
不幸的是,由于您有const_iterator
,&iter->second
将是(const pTip *)
所以,要么得到一个非const迭代器,要么使.tip成员成为const pTip *
,或者如果你绝望,就抛弃const:
final.tip = const_cast<pTip*>(&iter->second);
最后说明:您可能更喜欢pTip const*
到const pTip *
- 它们的意思相同。
答案 1 :(得分:0)
您是否已将final.tip
初始化为指向“空”的提示......?否则你将复制到未初始化的内存中。也许你的意思是final.tip = new pTip(iter->second)
,即复制构造函数进入新分配的存储?另外要注意那个char name[]
构造 - 如果没有长度,自动生成的复制构造函数可能会遇到麻烦,所以你可能需要明确地编写你需要的拷贝代码!
答案 2 :(得分:0)
我很惊讶这个作品。除非你有一个初始化你在这里显示的final.tip的代码,否则这会在内存中的随机位置写入iter-&gt; second的值,这会导致不可预测的结果。
答案 3 :(得分:0)
此代码:
*final.tip = iter->second
很可能最终导致您的程序开始表现不正常。你在踩着记忆。 final.tip是一个未初始化的指针,它可以指向任何地方。无论它指向用iter-&gt; second的内容覆盖的任何地方,你都会造成这种情况。
我不完全确定你想在这里完成什么。您的问题的答案在很大程度上取决于此。
pTip中的char name[]
构造也很有趣且有问题。看起来你正试图在结构的末尾使用弹性缓冲区,这是一种常见的C技术。当与STL容器混合时,这不太可能正常工作。
我怀疑你打算将地图映射到指针而不是结构副本。我怀疑你的意思更像是:
typedef struct
{
float x;
float y;
char name[];
} *pTip;