2013-06-24 3 views
0

У меня есть член класса std::vector<myClass*>, который я хотел бы предоставить public const-access в интерфейсе класса. Для этого я хочу, чтобы иметь возможность написать:Как нарисовать std :: vector <myClass*> на std :: vector <const myClass * const>?

class myClass{ 
     public: 
     myClass() { /*allocate dynamic stuff */}; 
     virtual ~myClass() { /* delete dynamic stuff */}; 

     //Accessors 
     const std::vector<const myClass * const> members() const{ //<- How do I implement? 

      //Compiles Fine - cit iterates over const int* objects 
      std::vector<myClass*>::iterator it = _members.begin(); 

      //Does not compile 
      std::vector<myClass* const>::const_iterator citc= it; 

      //I need citc to iterate over  cosnt int* const  objects - How? 
      std::vector<const myClass * const> members_(citc, citc + _members.size()); //Compile Error 

      return members_; 
     }; 
     /* ...moar stuff....*/ 
     private: 
     /* ...moar stuff...*/ 
     std::vector<myClass*> _members; 
    }; 

Этот код был очищено пример из контекста, так что я не был скомпилирован, но в самом коде, я вывел из пары экрана длин сообщения об ошибках, что единственная серьезная проблема заключалась в том, что мне нужен итератор citc для итерации поверх объектов const myClass * const, а не объектов const myClass *. Мысли? Спасибо, мил.

+0

Прежде всего, чтобы уточнить: вы хотите создать копию всего вектора указателей, правильно? Не только листинг типа в том смысле, что он все еще относится к исходному объекту, но под другим типом, правильно? – jogojapan

+0

Вместо предоставления доступа к самому вектору, дайте ему доступ к итераторам. Возможно, захотите вернуть const_iterator с помощью 'cbegin' и' cend'. –

+0

@jogojapan Извините. Это то, что я пытаюсь сделать в коде, но прямой тип-cast будет работать. Любопытно, что бы то ни было относительно быстро и не позволяет публичному доступу изменять любой вектор _members, то, на что он указывает, или изменять элементы, на которые он указывает. Надеюсь, это поможет. – user27886

ответ

1
return std::vector<myClass const *>(_members.begin(), _members.end()); 

И удалить этот один const из вашего возвращаемого значения (2-ой в <> с). Он ничего не делает, а мешает.

+0

Спасибо, это отлично работает. – user27886

+0

Итак, я действительно задавался вопросом ... Есть ли способ вернуть объект по ссылке, содержащей указатели – user27886

+0

@ user27886 Возвращение локальных объектов по ссылке - неопределенное поведение: ссылки не управляют сроками службы. – Yakk