【发布时间】:2019-06-09 17:46:27
【问题描述】:
对不起,如果这听起来很愚蠢,我努力了 3 个小时来避免提出愚蠢的问题,我发现了问题所在,但试图更深入地理解它,我没有找到明确的答案,所以我希望各位专家给我一个关于类行为向量及其对象加入的简要“理论”解释。
我注意到如果我定义一个类,例如
class Variant {
std::map<std::string, std::string> attributes;
public:
void addAttr(std::string attr, std::string value){
if ( !attributes.insert( std::make_pair( attr, value ) ).second ) std::cout << "inserted fail for: " << attr << " (attribute already present)" << '\n';
attributes.insert( std::make_pair( attr, value ) );
}
std::string getValue(std::string attr){ return attributes.at(attr); }
};
我把它的对象放在一个向量中:
std::vector<Variant> vVarClass;
for (int i = 0; i < 10; i++ ) {
Vector tmp;
tmp.addAttr("one", "first");
tmp.addAttr("two", "second");
tmp.addAttr("three", "third");
vVarClass.push_back(tmp);
}
然后我可以通过以下方式轻松访问类对象的属性:
for ( auto var : vVarClass ) {
std::cout << var.getValue("one") << '\n';
}
first
first
...
但如果我尝试通过类向量循环添加属性,它不会将其插入到地图中:
for ( auto var : vVarClass ) {
var.addAttr("four", "fourth");
}
没有错误,但是:
for ( auto var : vVarClass ) {
var.getValue("four");
}
terminate called after throwing an instance of 'std::out_of_range'
what(): map::at
Aborted
因为它在地图中没有找到这个属性。 但是,如果通过其特定位置访问每个成员,它会起作用:
for ( int i = 0; i < vVarClass.size(); i++ ) {
vVarClass[i].addAttr("four", "fourth");
}
for ( auto var : vVarClass ) {
var.getValue("four");
}
fourth
fourth
...
自动迭代器是否对对象进行“复制”,将属性插入此对象而不是原始对象?
非常感谢您的任何帮助!
【问题讨论】:
-
“自动迭代器是否对对象进行“复制””
for ( auto var : vVarClass )等价于for ( Person var : vVarClass )。如果你想对引用而不是副本进行操作,你应该写for ( auto& var : vVarClass )。有关auto究竟是什么的更多信息,请考虑阅读documentation。
标签: c++ function class attributes