如果我有一个对象矢量,例如:
std::vector<Foo> foos;
for(int i = 0; i < 10; i++) {
foos.push_back(Foo());
}
并且我可以说我在不同类型的Bar
s中区分它们,每个Foo
都有std::vector<Bar> bars;
bars.push_back(Bar());
bars.push_back(Bar());
for(int i = 0; i < 5; i++)
bars.at(0).addFoo(foos.at(i));
for(int i = 5; i < 10; i++)
bars.at(1).addFoo(foos.at(i));
s的向量:
foos.at(0).setValue(1)
如果我现在做bars.at(0).getFoo(0).getValue()
,std::vector<Bar> bars;
bars.push_back(Bar());
bars.push_back(Bar());
for(int i = 0; i < 5; i++)
bars.at(0).addFoo(&foos.at(i));
for(int i = 5; i < 10; i++)
bars.at(1).addFoo(&foos.at(i));
不会是1,所以我必须创建指针:
bars.at(0).getFoo(0).getValue()
foos.pop_back()
现在将返回1.
但是如何正确清理这些指针呢?
bars.at(1)
,我怎样才能自动将bars
中的最后一个Foo指针删除?因为在我的程序中,我有时不知道bars.at(1).removeLastFoo()
向量中指向精确对象的指针在哪里。foos
,那么该对象将在removeLastFoo()
中保持活力(并且也应该)。 Bar
只会删除Foo
s的bars.pop_back
向量的最后一个指针并弹出它吗?Bar
,我是否必须在--author="BtheDestroyer"
的析构函数中写入以删除每个指针?如果我忘记了什么,请告诉我。
或者是否有一种更优雅的方式(我实际上不喜欢使用指针,但我没有别的方法)能够在不同的位置看到相同的变化?
答案 0 :(得分:0)
最后,我通过不向bars
添加任何对象或指针来修复我的问题。我修改了Bar
类,而不是添加Foo对象或指针,而是从原始foos
向量中添加了索引。
// create foos
std::vector<Foo> foos;
for(int i = 0; i < 10; i++) {
foos.push_back(Foo());
}
// create bars
std::vector<Bar> bars;
bars.push_back(Bar());
bars.push_back(Bar());
for(int i = 0; i < 5; i++)
bars.at(0).addFooIndex(i);
for(int i = 5; i < 10; i++)
bars.at(1).addFooIndex(i);
// print & calculate
foos.at(0).setValue(1);
std::cout << foos.at(bars.at(0).getFirstIndex()).getValue() << std::endl; // prints 1
foos.at(bars.at(0).getFirstIndex()).setValue(2);
std::cout << foos.at(0).getValue() << std::endl; // prints 2
答案 1 :(得分:0)
如果您使用的是C ++ 11,则可以使用shared_ptr和weak_ptr的组合:
std::vector<std::shared_ptr<Foo>> foos;
在Bar内部你会有一个weak_ptr的向量:
std::vector<std::weak_ptr<Foo>> foos_inside_bar;
for(int i = 0; i < 5; ++i) {
std::weak_ptr<Foo> weak_foo_ptr = foos.at(i);
bars.at(0).addFoo(weak_foo_ptr);
}
如果您执行foos.pop_back()
,shared_ptr
中的foos
会被删除,而最后weak_ptr
条会expire。weak_ptr
如果您移除bars
中的shared_ptr
,则foos
中的gradlew test
会保持活跃状态。