virtual not friend function

Тема в разделе "LANGS.C", создана пользователем ltshck, 26 окт 2011.

  1. ltshck

    ltshck New Member

    Публикаций:
    0
    Регистрация:
    5 ноя 2007
    Сообщения:
    195
    Следующая задача. Надо в конструкторе класса заменить адрес метода.

    Есть класс объекта

    Код (Text):
    1. class Titem {
    2. public:
    3.  virtual bool exist();
    4. };
    Есть какойто отдельный класс, в котором в одном из методов возвращаем этот объект.

    Код (Text):
    1. class Tarray {
    2. public:
    3.  Titem &getitem(char *name);
    4.  bool exist(char *name);
    5. };
    По ходу работы хочется вот что.
    Код (Text):
    1. Tarray ar;
    2. Titem it;
    3. it = ar.getitem("item"); //если объект с названием "item" есть то все ок, иначе исключение. хочется проверить наличие объекта в массиве
    поэтому правильнее можно написать

    Код (Text):
    1. if (ar.exist("item"))
    2.  it = ar.getitem("item");
    но это не есть красиво. хочется следующее

    Код (Text):
    1. if (ar.getitem("item").exist())
    2.  it = ar.getitem("item");
    вопрос в том как это сделать.
    была мысль

    Код (Text):
    1. class Titem {
    2. public:
    3.  virtual bool exist();
    4.  Titem (Tarray *a) {
    5.    exist = a->exist;
    6.  }
    7. };
    но так не работает.
     
  2. ltshck

    ltshck New Member

    Публикаций:
    0
    Регистрация:
    5 ноя 2007
    Сообщения:
    195
    нашел решение
    Код (Text):
    1. class Titem {
    2. private:
    3.  Tarray *ar;
    4. public:
    5.  bool exist() { return ar->exist(); };
    6.  Titem (Tarray *a) {ar=a;}
    7. };
    но это немного не то
     
  3. sergegers

    sergegers New Member

    Публикаций:
    0
    Регистрация:
    8 июн 2008
    Сообщения:
    172
    Зачем это нужно, непонятно. Но метод Tarray.get_item() может возвращать враппер для объекта Titem , у которого есть оператор преобразования к Titem . Тогда метод Tarray.get_item() будет возвращать пустой TitemWrapper, если такого элемента нет, а TitemWrapper.exist() будет возвращать true, если он не пуст. Враппером может быть какой-либо из вариантов смарт-поинтера
     
  4. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    Дальше не читал.
     
  5. Dmitry_Milk

    Dmitry_Milk Member

    Публикаций:
    0
    Регистрация:
    20 ноя 2007
    Сообщения:
    540
    Дык, а механизм исключений чем не устраивает? возвращайте то, что нужно, а нет - кидайте исключение. Захотите простую программу, без проверок (типа, если уверены в корректности индекса) - не ловите. Захотите, чтоб было все четко - ловите.
     
  6. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    if (ar.getitem("item"))

    Итераторы на подобной лабуде работают и ничего.
     
  7. ltshck

    ltshck New Member

    Публикаций:
    0
    Регистрация:
    5 ноя 2007
    Сообщения:
    195
    исключения да. добавил. хорошая мысль. всем спасибо кто читал :)
     
  8. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Не всегда это хорошая мысль, исключения шибко тормозные.
     
  9. Dmitry_Milk

    Dmitry_Milk Member

    Публикаций:
    0
    Регистрация:
    20 ноя 2007
    Сообщения:
    540
    Вот еще вариант без исключений и без врапперов:
    Завести в классе Titem статический объект
    static Titem nullobj; (не забыв определить его в глобальной области Titem::nullobj(аргументы);)
    не важно с какими параметрами-значенниями.

    А функцию Titem::exists реализовать как bool exists() {return this!=&nullobj;}. Для любых объектов, за исключением nullobj, она всегда будет возвращать true, для объекта nullobj - false.

    Тогда из Tarray::getitem и других подобных в случае невозможности вернуть ссылку на настоящий объект возвращать ссылку на Titem::nullobj. Работать должно быстро, потому что никаких конструирований на лету не производится, все уже сконструировано заранее. Фактически это получается альтернатива возврату null, еслиб возвращался указатель, а не ссылка.