使用向量访问类的成员
Posted
技术标签:
【中文标题】使用向量访问类的成员【英文标题】:access a member of class using vector 【发布时间】:2011-08-30 17:10:51 【问题描述】:我有一个类定义为
typedef std::string Name;
typedef int Age;
typedef std::string Level;
class Employee
public:
// Employee (arguments);
// virtual ~Employee ();
void name(Name const & name) name_ = name;
Name name() const return name_;
void age(Age const & age) age_ = age;
Age age() const return age_;
void level(Level const & level) level_ = level;
Level level() const return level_;
private:
Name name_;
Age age_;
Level level_;
;
std::vector<Employee> read_file(std::string filename);
std::vector<Employee> employees = read_file("data.txt");
std::cout << employees.size() << std:: endl;
for(std::vector<Employee>::iterator it = employees.begin(); it != employees.end(); ++it)
std::cout << *it << std::endl;
有没有办法让我使用上面定义的这个向量来访问 Employee 类的成员?我想构建一个map
容器,以员工级别作为键值。
【问题讨论】:
【参考方案1】:如果您想从迭代器访问Employee
的成员,您可以使用成员访问运算符->
:
the_map[it->level()] = blah;
【讨论】:
【参考方案2】:除非我误解了你的问题,否则这很简单。
it
是 Employee
向量的迭代器。
*it
是 Employee
it->
允许您访问该 Employee
的成员
例如:it->name()
所以,如果你想建立一个员工级别到Employee
的地图,你可以这样做:
std::map<Level, Employee> employeeMap;
for(std::vector<Employee>::iterator it = employees.begin();
it != employees.end();
++it)
employeeMap[ it->level() ] = *it;
现在您有了自己的employeeMap,它将员工的Level
映射到Employee
【讨论】:
谢谢 :) 我在找it->
【参考方案3】:
const Name name = it->name();
const Age age = it->age();
const Level level = it->level();
或
const Name name = employees[i].name();
const Age age = employees[i].age();
const Level level = employees[i].level();
会正常工作。
不过,我强烈建议您将上述各项作为参考返回,因为它通常比复制对象要快得多。
即
class Employee
public:
// Employee (arguments);
// virtual ~Employee ();
void name(Name const & name) name_ = name;
Name& name() return name_;
const Name& name() const return name_;
void age(Age const & age) age_ = age;
Age& age() return age_;
const Age& age() const return age_;
void level(Level const & level) level_ = level;
Level& level() return level_;
const Level& level() const return level_;
private:
Name name_;
Age age_;
Level level_;
;
然后您可以通过引用访问这些值,如下所示:
const Name& name = it->name();
const Age& age = it->age();
const Level& level = it->level();
这也意味着您可以像这样更改值:
it->name() = "Goz";
it->age() = 33;
it->level() = "Programmer";
【讨论】:
我强烈建议不要从 const 成员返回引用。从非 const 版本返回引用,从 const 函数返回 const 引用。 如果您从非常量成员返回引用,则该对象也可能是公共的。如果它是私人的,你不希望这样。只做 const 参考版本。 如果要从 const 方法返回引用,最好返回const
引用。
@Mooing Duck:哎呀只是我瞎了;)是的,它要么不是 const 函数(因为我也修改了它),要么你需要返回一个 const 对象。一般来说,我建议同时拥有...
@Goz:你会建议通过(非常量)引用返回成员而不是公开它?哦对了,封装。是的,这样做。以上是关于使用向量访问类的成员的主要内容,如果未能解决你的问题,请参考以下文章
GroovyGroovy 方法调用 ( 使用 对象名.成员名 访问 Groovy 类的成员 | 使用 对象名.‘成员名‘ 访问类的成员 | 使用 对象名[‘成员名‘] 访问类成员 )