使用向量访问类的成员

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 的成员,您可以使用成员访问运算符-&gt;

the_map[it->level()] = blah;

【讨论】:

【参考方案2】:

除非我误解了你的问题,否则这很简单。

itEmployee 向量的迭代器。 *itEmployee it-&gt; 允许您访问该 Employee 的成员 例如:it-&gt;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-&gt;【参考方案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:你会建议通过(非常量)引用返回成员而不是公开它?哦对了,封装。是的,这样做。

以上是关于使用向量访问类的成员的主要内容,如果未能解决你的问题,请参考以下文章

C++从类的向量指针访问类的成员

如何允许访问向量是类成员的向量元素?

如何从头文件中访问类的私有成员?

保持类的向量成员与类实例连续

如何使用多态性从基类访问派生类向量成员?

GroovyGroovy 方法调用 ( 使用 对象名.成员名 访问 Groovy 类的成员 | 使用 对象名.‘成员名‘ 访问类的成员 | 使用 对象名[‘成员名‘] 访问类成员 )