我试图使用动态强制转换将1类向量的值推送到其他类向量。但是我遇到了分段错误。
当我使用gdb调试程序时,我发现dynamic_cast
没有发生,所以没有值推送到矢量。
我在这里尝试将元素从std::vector<BPatch_point *> *points
复制到std::vector<ldframework::Point *> *lpoints
。
BPatch_point
和Point
是完全不相关的类。
你能帮帮我吗?
int main(int argc , char *argv[])
{
BPatch bpatch;
int pid;
if (argc != 3) {
exit(1);
}
pid=atoi(argv[1]);
char name[ 40 ];
cout<<"The attached pid is "<<pid<<endl;
BPatch_process *appProc = bpatch.processAttach("",pid);
BPatch_image *img = appProc->getImage();
std::vector<BPatch_function *> functions;
std::vector<BPatch_point *> *points;
img->findFunction(argv[2], functions);
if(functions.size()==0) {
cout<<"unable to find the function "<<argv[2]<<endl;
return -1;
}
else {
cout<<"The "<<argv[2]<<" function is found"<<endl;
}
points = functions[0]->findPoint(BPatch_entry);
if ((*points).size() == 0) {
cout<<"Not able to find the points"<<endl;
}
cout<<"The points is "<<(*points)[0];
std::vector<ldframework::Point *> *lpoints=NULL;
for(unsigned int i=0; i<(*points).size();i++)
{
lpoints->push_back(dynamic_cast<ldframework::Point *>((*points).at(i)));
}
}
答案 0 :(得分:3)
您需要做的是逐个转换对象,而不是转换对象。幸运的是,标准库非常容易。
#include <vector>
#include <algorithm>
#include <iterator>
ClassB * ConvertAtoB(ClassA * a)
{
// create a new object of type ClassB here
}
int main()
{
std::vector<ClassA*> a;
// fill 'a' with data
// ...
// then transform it into 'b'
std::vector<ClassB*> b;
std::transform(a.begin(), a.end(), std::back_inserter(b), ConvertAtoB);
}
答案 1 :(得分:2)
这里我试图将元素从std :: vector *点复制到std :: vector * lpoints。你能帮帮我吗?
BPatch_point和Point是完全无关的classess。
这可以翻译为:
我有一个有大象的动物园。能帮我解决一下如何将这些大象转换成橙子并将它们放入橙色容器盒中吗?
当课程不相关时,他们唯一的共同点是void *
- &#34;指向某事物的指针&#34;。另一种选择是使用占位符来表示任何值 - 例如boost::any
。
但核心问题是:为什么你想将一种类型的类移动到另一种类的容器中。有99.8%的可能性,你首先做错了什么,那就是你应该找到解决方案的地方。
编辑:(回应评论)
您能否建议如何使用boost :: any方法或void *方法
来完成
将std::vector<ldframework::Point *>
替换为std::vector<boost::any>
(如果您可以在项目中使用boost库)或std::vector<void *>
。然后你就可以放任何东西。
虽然我仍然相信,你做的事情非常错误。如果您真的知道,您正在做什么,请随意使用所描述的解决方案。