Следующая задача. Надо в конструкторе класса заменить адрес метода. Есть класс объекта Код (Text): class Titem { public: virtual bool exist(); }; Есть какойто отдельный класс, в котором в одном из методов возвращаем этот объект. Код (Text): class Tarray { public: Titem &getitem(char *name); bool exist(char *name); }; По ходу работы хочется вот что. Код (Text): Tarray ar; Titem it; it = ar.getitem("item"); //если объект с названием "item" есть то все ок, иначе исключение. хочется проверить наличие объекта в массиве поэтому правильнее можно написать Код (Text): if (ar.exist("item")) it = ar.getitem("item"); но это не есть красиво. хочется следующее Код (Text): if (ar.getitem("item").exist()) it = ar.getitem("item"); вопрос в том как это сделать. была мысль Код (Text): class Titem { public: virtual bool exist(); Titem (Tarray *a) { exist = a->exist; } }; но так не работает.
нашел решение Код (Text): class Titem { private: Tarray *ar; public: bool exist() { return ar->exist(); }; Titem (Tarray *a) {ar=a;} }; но это немного не то
Зачем это нужно, непонятно. Но метод Tarray.get_item() может возвращать враппер для объекта Titem , у которого есть оператор преобразования к Titem . Тогда метод Tarray.get_item() будет возвращать пустой TitemWrapper, если такого элемента нет, а TitemWrapper.exist() будет возвращать true, если он не пуст. Враппером может быть какой-либо из вариантов смарт-поинтера
Дык, а механизм исключений чем не устраивает? возвращайте то, что нужно, а нет - кидайте исключение. Захотите простую программу, без проверок (типа, если уверены в корректности индекса) - не ловите. Захотите, чтоб было все четко - ловите.
Вот еще вариант без исключений и без врапперов: Завести в классе Titem статический объект static Titem nullobj; (не забыв определить его в глобальной области Titem::nullobj(аргументы) не важно с какими параметрами-значенниями. А функцию Titem::exists реализовать как bool exists() {return this!=&nullobj;}. Для любых объектов, за исключением nullobj, она всегда будет возвращать true, для объекта nullobj - false. Тогда из Tarray::getitem и других подобных в случае невозможности вернуть ссылку на настоящий объект возвращать ссылку на Titem::nullobj. Работать должно быстро, потому что никаких конструирований на лету не производится, все уже сконструировано заранее. Фактически это получается альтернатива возврату null, еслиб возвращался указатель, а не ссылка.