2015-01-07 5 views
0

Вот простой пример вложенных классов, которые, по моему мнению, являются логически правильным:Управление вложенных классов

class PIS{ // passenger information system 
    public: 
     class BusStop; 
     void add_busStop(); 
     //... other methods 
    private: 
     std::vector<BusStop> busStops; //There are many bus stops 
}; 

class PIS::BusStop{ 
    public: 
     struct BusInfo; 
     std::string get_stopName(); 
     //... other methodes 
    private: 
     std::vector<BusInfo> informationBoard; 
}; 

struct PIS::BusStop::BusInfo{ 
    std::string mfrom; 
    std::string mto; 
    //... etc. 
}; 

Я не знаю, как я должен реализовать интерфейс для этого. Основная проблема здесь - доступ к частным объектам. Ниже вы можете увидеть, что я говорю о:

PIS oPIS; //PIS object; 
oPIS.add_busStop(); //New BusStop object is pushed to the vector busStops 

Теперь, как я могу получить доступ к методам в объекте Автобусная остановка? Должен ли я добавить метод get_busStops() в класс PIS, который вернет указатель на этот вектор? Или, может быть, векторные автобусы должны быть общедоступными? Последнее решение, о котором я могу думать, - это метод, который возвращает только один объект BusStop, хранящийся в векторе busStops, который примет его индекс в качестве аргумента.

+1

Я предпочел бы возвращать константу-ссылку и/или ссылку из 'getBusStops()', чем указатель. И независимо от того, я бы 'addBusStop (остановка BusStop)' с перемещением семантики copy-swap. Не имеет смысла добавлять стоп произвольно, пока вы не узнаете, что это такое. Однако я не вижу решения с одним ответом на этот вопрос, поскольку, похоже, это похоже на мнение об осуществлении. – WhozCraig

ответ

3

Я думаю, что вы должны оставить std::vector<BusStop> busStops частным и в ваших методах реализации класса PIS, которые будут охватывать все операции, которые понадобятся для работы с вашими частными объектами, а не просто возвращать указатель на весь вектор или даже на один объект.

Для методов доступа в BusStop и ниже вы можете реализовать методы зеркала в PIS классе:

class PIS{ // passenger information system 
public: 
    class BusStop; 
      std::string get_StopName(int iBusStopIndex){return busStops[iBusStopIndex].get_StopName();}; 
      void add_busStop(); 
      //... other methods 
     private: 
      std::vector<BusStop> busStops; //There are many bus stops }; 

Это может быть неприятно делать это для каждого метода, но ваш код будет проще использовать и читать для вас и других программистов после его реализации.

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

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