|
С++. Коллекция-член только для чтения | ☑ | ||
---|---|---|---|---|
0
Ненавижу 1С
гуру
03.08.11
✎
12:35
|
Я хочу чтобы объекты моего класса содержали член-коллекцию указателей на объекты, которая была бы доступна извне только для чтения. То есть состав коллекции извне изменять нельзя, сами элементы коллекции могут менять свои свойства. Правильно для этого определить класс вот так:
template<typename T> class A { public: typedef std::vector<T*> vector; private: vector v; public: const vector& Vector() const { return v; } }; A<B> a; const A<B>::vector& v = a.Vector(); собственно вопрос? |
|||
1
Steel_Wheel
03.08.11
✎
12:39
|
Не совсем. Функция вектор вернет указатель на массив. По указателю, я добираюсь до любого его члена.
|
|||
2
Steel_Wheel
03.08.11
✎
12:41
|
Думаю, лучше бы определить свойство для хранения длины твоего вектора. И выдавать вектор поэлементно по индексам
|
|||
3
Steel_Wheel
03.08.11
✎
12:41
|
Хотя давно я в руки шашек не брал
|
|||
4
Ненавижу 1С
гуру
03.08.11
✎
12:41
|
(1) не указатель, а ссылку, но не суть
сами элементы вектора можно изменять, нельзя менять состав вектора |
|||
5
Steel_Wheel
03.08.11
✎
12:47
|
если у вектора есть соответствующие методы (там swap(), get(), set(), sort().... то по ссылке как раз можно будет и менять его состав).
Тебе будет намного проще отдавать копию твоего вектора: public: const vector& Vector() const { vecotr temp = v.copyAll(); return temp; } }; |
|||
6
Ненавижу 1С
гуру
03.08.11
✎
12:49
|
(5) копию не хочу, set() swap() sort() по идеи не могут быть объявлены как const методы, а значит вызвать их не получится
|
|||
7
BigRoma
03.08.11
✎
12:55
|
(6) можно создать класс, в нем определить операцию [] в которой обращаться к элементам вектора.
|
|||
8
Rabbit
03.08.11
✎
12:58
|
Отдавать не указатель на коллекцию, а итератор со взведённым запретом на изменение?
|
|||
9
Ненавижу 1С
гуру
03.08.11
✎
12:58
|
(7) как минимум нужно тогда метод Count() к тому же создать, но это не кошерно, потеря в скорости доступа при тупом обходе всех элементов
|
|||
10
Ненавижу 1С
гуру
03.08.11
✎
13:02
|
(8) нужно передавать еще и стоп-итератор, короче городить собственный огород классов
|
|||
11
Rabbit
03.08.11
✎
13:05
|
(10) Ну, голым С++ изменение данных по ссылке не запретить.
|
|||
12
Ненавижу 1С
гуру
03.08.11
✎
13:07
|
(11) ну она же const ссылка
|
|||
13
BigRoma
03.08.11
✎
13:12
|
(9) не понял про обход, у std::vector есть size() который можно использовать в Count()
|
|||
14
Ненавижу 1С
гуру
03.08.11
✎
13:28
|
(13) можно, но итерация по индексу смещения дольше
вот это for(int i=0;i<v.size();++i) { //обращение к v[i] будет каждый раз бегать по v и искать элемент нужного индекса } |
|||
15
DmitrO
03.08.11
✎
13:30
|
правильно, если не принимать во внимание возможность использования const_cast<>()
|
|||
16
Ненавижу 1С
гуру
03.08.11
✎
13:31
|
(15) ну выстрелить в ногу каждый может
|
|||
17
BigRoma
03.08.11
✎
13:32
|
(14) не надо, см. vector::operator[]
т.е. ты просто "замэпишь" вызов. |
|||
18
Xapac
03.08.11
✎
13:35
|
которая была бы доступна извне только для чтения
пыши с идентификатором const и будет счастье class A { // const vector GetVector(){return v;} // } |
|||
19
Ненавижу 1С
гуру
03.08.11
✎
13:44
|
(17) каждый раз вычисляет это дело
|
|||
20
BigRoma
03.08.11
✎
13:47
|
(19) уверен?
|
|||
21
Ненавижу 1С
гуру
03.08.11
✎
14:23
|
(20)
reference operator[](size_type __n) { return *(this->_M_impl._M_start + __n); } |
|||
22
BigRoma
03.08.11
✎
14:33
|
(21) ну вроде не "тяжелое" вычисление? Адресация по смещению - кажись легкая операция.
|
|||
23
Андрей_Андреич
naïve
03.08.11
✎
14:34
|
Член только для чтения - самый эротичный облом
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |