2014-01-28 6 views
0

У меня есть класс UserКак перебрать вектор указателя класса

class User 
{ 
     public: 
      User(); 
      User(string, string); 
      virtual string getRole(); 

      void setPW(string); 
      void setID(string); 
      string getPW(); 
      string getID(); 

     protected: 
      string id; 
      string pw; 
}; 

И несколько подклассов, которые наследуют от User

class Customer : public User 
{ 
     public: 
      Customer(); 
      Customer(string, string,string,string, string, string, string, string, string); 

         virtual string getRole(); 
         string getSname(); 
         string getFname(); 
         string getTitle(); 
         string getAddress(); 
         string getTown(); 
         string getCity(); 
         string getPostalCode(); 

         void setSname(string); 
         void setFname(string); 
         void setTitle(string); 
         void setAddress(string); 
         void setTown(string); 
         void setCity(string); 
         void setPostalCode(string); 




     private: 
      string sname; 
      string fname; 
      string title; 
      string address; 
      string town; 
      string city; 
      string postalcode; 
}; 

Вся информация хранится внутри вектора, который содержит указатели класс User

vector<User*> userVector 

Как выполнить итерацию вектора указателей в класс и вызвать соответствующие методы класса?

Если его вектор объекта пользователя, я могу объявить итератор vector<User>::iterator p, есть что-то эквивалент для указателей на объект, и как я называю соответствующий метод класса в зависимости от объекта

EDIT, это то, что я попытался

vector<User*>::iterator p; 

    p=userVector.begin(); 

    while (p != userVector.end()) 
    { 

     //how to dereference 
     p++; 
    } 
+0

один предмет за раз. как всегда, покажите нам, что вы пробовали – ldgorman

+0

Знаете ли вы, как использовать указатели * вне * векторов? Если это так, добавьте это знание к знанию, которое вы показываете здесь. Если нет, вернитесь на шаг и узнайте об этом в первую очередь. – molbdnilo

ответ

1

итераторы ведут себя как указатели на пути, что они могут быть разыменовываются и incremented (другие операции зависят от категории итератора).

Если у вас есть вектор указателей, то разыменование его итератора дает вам указатель. Это означает, что вам нужно разыгрывать еще раз, чтобы добраться до членов. Предполагая, что it является итератор:

(*it) -> getID() 
//^ ^^ 
// |  second dereferencing 
// first dereferencing 
1

итератора в основном функции как указатель, так что вы можете рассмотреть vector<TYPE>::iterator быть эквивалентом TYPE*

Это означает, что vector<TYPE*>::iterator приравнивает к TYPE**

Таким образом, чтобы получить в ваших функциях, вам просто нужно разыменования итератора:

for(vector<User*>::iterator iter = userVector.begin(); iter != userVector.end(); ++iter) 
{ 
    std::cout << (*iter)->getRole() << std::endl; 
} 
2

Я рекомендую следующие 3 решения в его приоритетном порядке. Вы можете выбрать то, с чем вам удобно.

  1. Если вы используете возможности C++ 11, вы можете использовать циклы, основанные на диапазонах, для упрощения синтаксиса. Это всегда полезно.

  2. Использовать цикл for_each.

  3. В противном случае используйте как это, что было бы более оптимальным.

    for(vector<User*>::iterator itr = userVector.begin(), itr_end = userVector.end(); itr != itr_end; ++itr) 
    { 
        std::cout << (*itr)->getRole() << std::endl; 
    } 
    

Здесь вы не собираетесь получить торцевую итератор каждую итерацию контура обхода.

Смежные вопросы