Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Доступ к элементам вектора, Работа с классом 
:(
    Опции темы
artsb
Дата 9.2.2009, 10:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2280
Регистрация: 17.7.2007
Где: центр Вселенной

Репутация: 39
Всего: 64



Всем привет.

У себя в классе использую вектор структур, который объявил в области protected. Написал функции для работы с вектором (добавление и удаление записей и т.п.). Теперь, нужно как-то предоставить доступ к структурам, хранящимся в векторе (Желательно, чтобы это выглядело как при работе с массивами, т.е. использовался индекс структуры в векторе).

Это осуществимо? Если да, то какие есть варианты?


--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
mrbrooks
Дата 9.2.2009, 10:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


Профиль
Группа: Завсегдатай
Сообщений: 4259
Регистрация: 4.10.2006
Где: Дол Гулдур

Репутация: 167
Всего: 306



artsb, вектор сам написал или std::vector ?
Если сам то, перегрузи для класса оператор []
доступ к элементам std::vector - как к массивах.
PM MAIL   Вверх
artsb
Дата 9.2.2009, 20:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2280
Регистрация: 17.7.2007
Где: центр Вселенной

Репутация: 39
Всего: 64



Цитата(mrbrooks @  9.2.2009,  10:35 Найти цитируемый пост)
вектор сам написал или std::vector ?

Нет, вектор из vector.hpp

Цитата(mrbrooks @  9.2.2009,  10:35 Найти цитируемый пост)
доступ к элементам std::vector - как к массивах. 

Я знаю. Но если открыть доступ к вектору, то станут доступны все функции и методы вектора. А этого хочется избежать. Именно поэтому я описал вектор в области protected и написал функции для добавления и удаления элементов. Осталось дать доступ к структурам, хранящимся в векторе.

Это сообщение отредактировал(а) artsb - 9.2.2009, 20:29


--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
Dmi3ev
Дата 9.2.2009, 20:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1698
Регистрация: 28.11.2007

Репутация: 16
Всего: 41



если функциями, то:
Код

//---------------------------------------------------------------------------
#include <iostream.h>
#include <vector>
struct mystr
{
int a;
int b;
};
class myclass
{
public:
 myclass(){};
 void Set(int size=1)
 {
  mystr ms;
  ms.a=1;
  ms.b=1;
  for (int i=0; i<size; i++)
   {
    v.push_back(ms);
    ms.a++;
    ms.b++ ;
   }
 };
 int Geta(int i){return v[i].a;};
 int Getb(int i){return v[i].b;};
 ~myclass(){};
private:
 vector<mystr> v;
};
int main()
{
myclass mc1;
mc1.Set(10);
cout<<mc1.Geta(2)<<endl;
cout<<mc1.Geta(3)<<endl;
system("pause");
        return 0;
}



--------------------

PM MAIL   Вверх
artsb
Дата 9.2.2009, 23:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2280
Регистрация: 17.7.2007
Где: центр Вселенной

Репутация: 39
Всего: 64



Вы не совсем поняли smile

У меня есть идея. Но не могу найти инфу о том, как перегрузить [] . Не подскажите?


--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
math64
Дата 10.2.2009, 08:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 4
Всего: 72



1.
Код

class myclass {
  vector<T> v;
public:
  T& operator[](int i) { return v[i]; }
};
myclass mc;
T t = mc[i];

2.
Код

class tmpclass {
  vector<T>& v;
public:
  tmpclass(vector<T>& v) : v(p_v) {}
  T& operator[](int i) { return v[i]; }
};
class myclass {
  vector<T> v;
piblic:
  tmpclass V;
  myclass() : V(v) {}
};
...
myclass mc;
T t = mc.V[i];

PM   Вверх
Usper
Дата 10.2.2009, 08:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 325
Регистрация: 13.4.2007

Репутация: 15
Всего: 15



Код

class TMyClass
{
    std::vector <int> m;
public:    
    int &operator [](int index)
   {
        return m[index];
   }
};

 int заменить на структуру


--------------------
На посохе волшебном нехилый набалдашник, большой такой, огромный, нехилый набалдашник.
PM MAIL   Вверх
artsb
Дата 10.2.2009, 09:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2280
Регистрация: 17.7.2007
Где: центр Вселенной

Репутация: 39
Всего: 64



math64(пример №1), Usper, спасибо. Я в принципе так и думал. Только собирался возвращать указатель, а не ссылку. smile

math64(пример №2),  ты понял! smile Это то, что нужно. Значит, мне потребуется ещё один класс.

Всем спасибо. Буду разбираться.


--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
mrbrooks
Дата 10.2.2009, 09:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


Профиль
Группа: Завсегдатай
Сообщений: 4259
Регистрация: 4.10.2006
Где: Дол Гулдур

Репутация: 167
Всего: 306



Цитата(artsb @  10.2.2009,  09:41 Найти цитируемый пост)
Только собирался возвращать указатель, а не ссылку.

А зря. Возвращая значение по ссылке, ты можешь этому элементу, помимо его считывания, так же и присваивать.

Это сообщение отредактировал(а) mrbrooks - 10.2.2009, 09:46
PM MAIL   Вверх
artsb
Дата 10.2.2009, 20:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2280
Регистрация: 17.7.2007
Где: центр Вселенной

Репутация: 39
Всего: 64



Цитата(mrbrooks @  10.2.2009,  09:44 Найти цитируемый пост)
Возвращая значение по ссылке, ты можешь этому элементу, помимо его считывания, так же и присваивать.

А мне как раз только для чтения и нужно smile

Спасибо всем.


--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
math64
Дата 11.2.2009, 09:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 4
Всего: 72



Возвращенный указатель тоже можно использовать для модификации значения, но для доступа нужна дополнительная операция разыменования (*), которая на размер кода не влияет, но уменьшает читаемость исходника - часто требуются дополнительные скобки.
Если нужно только чтение, можно возвратить константную ссылку (const T&) или, если возвращается простой тип (int, double, char, enum, ...), а также std::string, AnsiString, просто значение.
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




[ Время генерации скрипта: 0.0563 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.