我有權訪問工廠產生以如下方式對象:修改對象在容器無指針:矢量VS組
A a = factory.build();
我想存儲A
類型的對象在容器中,訪問它們,修改他們的內部狀態和下一個我通過容器訪問對象,我想訪問像以前一樣的對象(與修改後的狀態)。 我的第一個想法是在容器中存儲指向A
的指針。但是,如上所述,工廠不給我一個指向對象的指針,而是指向對象本身。
A類:
class A
{
private:
int id;
public:
A(int id)
{
this->id = id;
}
int getId() const
{
return id;
}
void setId(int id)
{
this->id = id;
}
};
我想通了,使用vector
了以下工作:
A obj1(1);
std::vector<A> vec;
vec.push_back(obj1);
A & obj = vec[0];
obj.setId(4);
for(std::vector<A>::iterator itr = vec.begin();itr!=vec.end();itr++)
{
std::cout << (*itr).getId() << endl;
}
這將打印修改ID:4
是使用std::set
類似可能的東西嗎?我試過如下:
struct AComp
{
bool operator()(const A lhs, const A rhs) const
{
return (lhs.getId() < rhs.getId());
}
};
和
A obj2(1);
std::set<A, AComp> mySet;
mySet.insert(obj2);
int id = 1;
auto result = std::find_if(mySet.begin(), mySet.end(), [id](A a) {return a.getId() == id;});
A tmp = *result;
tmp.setId(4);
std::cout << tmp.getId() << endl;
for(std::set<A>::iterator itr = mySet.begin(); itr!=mySet.end();itr++)
{
std::cout << (*itr).getId() << endl;
}
當然,這並不改變該組中的對象的狀態。但在這裏我不能說
A & tmp = *result;
這給了我:
binding ‘const hallo2::A’ to reference of type ‘hallo2::A&’ discards qualifiers
我怎麼會用一個std::set
實現這一目標?
如果您問是否可以修改集合中包含的對象,答案是否定的。 –