Имя: Пароль:
IT
 
С++. Коллекция-член только для чтения
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
Член только для чтения - самый эротичный облом
Компьютер — устройство, разработанное для ускорения и автоматизации человеческих ошибок.