получить доступ к члену класса, используя вектор - PullRequest
2 голосов
/ 30 августа 2011

У меня есть класс, определенный как

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 с уровнем сотрудника в качестве ключевого значения.

Ответы [ 3 ]

4 голосов
/ 30 августа 2011

Если вы хотите получить доступ к элементам Employee из итератора, вы можете использовать оператор доступа к элементу ->:

the_map[it->level()] = blah;
2 голосов
/ 30 августа 2011

Если я неправильно истолковываю ваш вопрос, это достаточно просто.

  • 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;
}

Теперь у вас есть карта employee, которая отображает Level сотрудника на Employee

2 голосов
/ 30 августа 2011
 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";
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...