我从迭代器到集合的返回值给出了内存位置而不是值。如何访问迭代器指向的元素?
我使用了一个类似的迭代器循环,之前工作正常,就像返回迭代器指向的值一样(对于deque和vector模板类)。
这个问题是对我今天早些时候遇到困难的脚本的跟进(C++ : adding an object to a set)。
该脚本现在看起来如下:
头文件
#ifndef EMPLOYEE_HH
#define EMPLOYEE_HH
#include <set>
#include <string>
#include <iostream>
using namespace std ;
class Employee {
public:
// Constructor
Employee(const char* name, double salary) :
_name(name),
_salary(salary) {
}
// Accessors
const char* name() const {
return _name.c_str() ;
}
double salary() const {
return _salary ;
}
// Print functions
void businessCard(ostream& os = cout) const {
os << " +--------------------+ " << endl
<< " | ACME Corporation | " << endl
<< " +--------------------+ " << endl
<< " Name: " << name() << endl
<< " Salary: " << salary() << endl ;
}
private:
string _name ;
double _salary ;
} ;
class Manager : public Employee {
public:
//Constructor
Manager(const char* _name, double _salary):
Employee(_name, _salary),
_subordinates() {
}
// Accessors & modifiers
void addSubordinate(Employee& empl) {
_subordinates.insert(&empl);
}
const set<Employee*>& listOfSubordinates() const {
return _subordinates;
}
void businessCard(ostream& os = cout) const {
Employee::businessCard() ;
os << " Function: Manager" << endl ;
set<Employee*>::iterator iter ;
iter = _subordinates.begin() ;
os << " Subordinates:" << endl ;
if(_subordinates.empty()==true) {
os << " Nobody" << endl;
}
while(iter!=_subordinates.end()) {
os << " " << *iter << endl ; // <-- returns the memory location
++iter ;
}
}
private:
set<Employee*> _subordinates ;
} ;
#endif
主要脚本
#include <string>
#include <iostream>
#include "Employee.hh"
using namespace std ;
int main() {
Employee emp1("David", 10000) ;
Employee emp2("Ivo", 9000) ;
Manager mgr1("Oscar", 18000) ; // Manager of Ivo and David
Manager mgr2("Jo", 14000) ;
Manager mgr3("Frank", 22000) ; // Manager of Jo and Oscar (and Ivo and David)
mgr1.addSubordinate(emp1) ;
mgr1.addSubordinate(emp2) ;
mgr3.addSubordinate(mgr1) ;
mgr3.addSubordinate(mgr2) ;
cout << '\n' ;
emp1.businessCard() ;
cout << '\n' ;
emp2.businessCard() ;
cout << '\n' ;
mgr1.businessCard() ;
cout << '\n' ;
mgr2.businessCard() ;
cout << '\n' ;
mgr3.businessCard() ;
cout << '\n' ;
return 0;
}
非常感谢任何帮助。
答案 0 :(得分:2)
如果这样:*iter
是一个地址,那么:*(*iter)
就是它的对象。
这适用于您的情况:
while(iter != _subordinates.end())
{
os << " " << **iter << endl ; // <-- returns the object
++iter;
}
修改:这解决了问题:(*iter)->name()
答案 1 :(得分:1)
那将是**iter
;迭代器的一个解除引用,一个用于迭代器引用的指针。