我可以访问以下列方式生成对象的工厂:
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
答案 0 :(得分:1)
错误告诉您*result
是const A&
,这意味着您不允许通过此引用修改对象。
那是因为你不能修改集合中的对象。如果你真的想要,那么你必须删除并重新插入对象。
答案 1 :(得分:0)
您没有提供工厂类或构建方法,因此我必须假设您指的是标准模式。
但是,如果您只需要一个指向对象的指针,那么应该这样做:
Aptr * A;
Aptr aptr =&amp;(factory.build());