对象尖传染媒介从另一个传染媒介的

时间:2018-02-27 23:25:10

标签: c++

我有

std::vector<MyObject> obs;

//fill obs...

std::vector<MyObject*> obsA;
std::vector<MyObject*> obsB;

for (MyObject &p: obs){
    if (p.type == "A"){
        obsA.push_back(p);
    }else{
        obsB.push_back(p);
    }
}

我正在尝试创建一些对象矢量的2个子集。我希望子集是指针,因此对obsA或obsB中的对象所做的任何更改都会反映在主要的obs矢量中。但是,当我尝试运行代码时,我收到以下错误:

src/main.cpp:55:26: error: no matching function for call to ‘std::vector<MyObject*>::push_back(MyObject&)’

我认为有&amp;在变量之后应该给该变量的地址,并且因为obsA和obsB以及指针的向量,它应该有效地将MyObject的地址插入那里。我在这里做错了什么?

2 个答案:

答案 0 :(得分:1)

  

我认为有&amp;在变量之后应该给该变量的地址,并且因为obsA和obsB以及指针的向量,它应该有效地将MyObject的地址插入那里。我在这里做错了什么?

您问题的最直接答案是以下列方式修改它。 p只是对obs中某个元素的引用。 &p为您提供了内存中{em>地址到p所引用的位置,这就是指针需要的内容。

for (MyObject &p: obs){
    if (p.type == "A"){
        obsA.push_back(&p);
    }else{
        obsB.push_back(&p);
    }
}

更大的问题是为什么你这样做。这似乎很可能会破坏并做坏事。无论何时修改原始向量obs(通过添加或删除元素),obsAobsB中的所有指针都可能无效(即,它们不再指向obs中的正确位置{1}})。更改向量obs的大小可能会导致内存重新分配并将obs的内容移动到内存中的新位置,该位置与obsA和{的元素位置不同{1}}正指向。然后obsBobsA的任何进一步使用将导致未定义的行为,这将导致异常行为和可能的崩溃。

有潜在的替代方案。例如,将obsB的内容替换为obs可能会有所帮助,但如果您从std::shared_ptr<>中删除一个元素,则无法在{{{}}中正确清理该元素1}}或obs(即,obsAobsB仍将该对象保留在内存中,并且无法正确删除)。 obsAobsB的组合可以起作用:

std::shared_ptr

但这变得非常复杂,所以你可能想重新考虑一下你的设计。

答案 1 :(得分:0)

你需要

 obsA.push_back(&p);

强烈建议使用shared_ptr而不是原始指针