Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Перегрузка операторов

2.9K
22 апреля 2004 года
Antisly
58 / / 22.04.2004
Дело такое - мне необходимо реализовать программный интерфейс следующим образом:

int i = SomeObj->Items->Count;
SomeObj->Items[1]->AnotherObj->Prop = SomethingElse;

Вопрос: Что должно возвращаться при вызове ->Items, чтобы я мог дальше использовать и 'operator[]' и 'operator->()'?

Пытался фозвращать модернизированный auto_ptr:

template <class X>
class ProPtr : public auto_ptr<X>
{
public:
...
template <class Y, class Z>
Y operator[] (Z arg) { return get()->operator[](arg); }
};

, но компилятор (Borland C++ Builder 5 Ent.) выдает ошибку "E2094 Operator '+' not implemented in type ProPtr<X>' for arguments of type 'int'". Работает лишь тогда, когда я явно вызываю оператор:

SomeObj->Items->operator[](1)->AnotherObj->...

Пожалуйста, подскажите ламеру как наиболее эффективно реализовать подобный интерфейс.
310
23 апреля 2004 года
fellow
853 / / 17.03.2003
SomeObj->Items должен иметь тип, для которого определён operator[], например vector<AnotherClass*>, т.е. вектор указателей на объекты типа AnotherClass. А у этого AnotherClass должен быть член Prop.
2.9K
24 апреля 2004 года
Antisly
58 / / 22.04.2004
Так-то оно так, но тогда я не смогу написать '...->Items->Count'. Мне придется писать '...->Items.Count'. А вся фишка в том, что хотелось бы везде использовать оператор '->'!!!
2.1K
25 апреля 2004 года
domovoi
27 / / 27.03.2003
Цитата:
Originally posted by Antisly
Так-то оно так, но тогда я не смогу написать '...->Items->Count'. Мне придется писать '...->Items.Count'. А вся фишка в том, что хотелось бы везде использовать оператор '->'!!!



А что если vector поместить в какой-нить класс и там сделать поле Count.
class BlaBla {
vector<bla *> Bla1;
int Count;
bla *operator [](int p) {return Bla1

;}
}
А Items сделать указателем на этот класс.
Но я скажу, что это извращенство. Зачем обязательно ->

310
25 апреля 2004 года
fellow
853 / / 17.03.2003
Цитата:
Originally posted by domovoi
Но я скажу, что это извращенство. Зачем обязательно ->



Абсолютно согласен с предыдущим оратором ;о)

Зачем такая упёртость? Формализм, блин, школярство и начётничество. Выбор типов для программы диктуется уж никак не каллиграфическими пристрастиями.

2.9K
25 апреля 2004 года
Antisly
58 / / 22.04.2004
Ладно, ладно. Убедили. Но, тем не менее, работа с умными указателями удобнее и эстетичнее. К тому же более безопасна, чем с обычными указателями. Жаль что работающее, а главное универсальное и элегантное решение так никто и не предложил. ;-(
310
26 апреля 2004 года
fellow
853 / / 17.03.2003
Цитата:
Originally posted by Antisly
Ладно, ладно. Убедили. Но, тем не менее, работа с умными указателями удобнее и эстетичнее. К тому же более безопасна, чем с обычными указателями. Жаль что работающее, а главное универсальное и элегантное решение так никто и не предложил. ;-(



О-о-о! Молодой человек не ищет лёгких путей в жизни! Похвально, весма похвально! хе-хе!

Только зачем заниматься непотребными извращениями? Вы ещё не додумались до чего-нибудь вроде:

Код:
#ifndef begin
#define begin {
#define end }
#define end. }
#define procedure void
#endif

procedure MyProc()
begin
 printf("MyProc");
end.


Всякой фиче - своё место и время. Не извращайте естественную семантику указателей и массивов. Умные указатели тоже палка о двух концах, а вовсе не средство на всякий случай жизни.
2.9K
27 апреля 2004 года
Antisly
58 / / 22.04.2004
Вот только не надо утрировать. Подобные заморочки я придумываю для тренировки мозгов и только. А если кому-то в облом напрягаться, то зачем вообще тогда отвечать на вопросы?
3
27 апреля 2004 года
Green
4.8K / / 20.01.2000
Цитата:
Originally posted by Antisly
Вот только не надо утрировать. Подобные заморочки я придумываю для тренировки мозгов и только. А если кому-то в облом напрягаться, то зачем вообще тогда отвечать на вопросы?


Для тренировки чтих мозгов? :D
Честно говоря не вижу ничего сложного в твоей задаче. Различных решений может быть море. Все зависит от того, что нужно конкретно, т.к. задача уж очень расплывчатая.

Можно так:

Код:
#include <vector>

template<class T>
class A :public std::vector<T, std::allocator<T> >
{
private:
    struct B
    {
        int Count;
    };
   
    B m;

public:
    B* operator->()
    {      
        m.Count = size();
        return &m;
    }
};

// Test
int main(int argc, char* argv[])
{
    A<int> Item;
    Item.push_back(5);
    int i = Item[0];
    int j = Item->Count;
}


Можно вот так:
 
Код:
class C
{
public:
    C* operator->()
    {              
        return this;
    }  

    int Count;
};


Детсад все это.
А вот действительно задачка:
Нужен шаблонный класс с помощью которого можно выяснить, является ли его аргумент массивом или же указателем. И в добавок узнать тип элементов.
Т.е. к примеру
 
Код:
char array[10];
char* ptr;

ArrayChecker<array>::result == 1;
ArrayChecker<array>::element_type == char;

ArrayChecker<ptr>::result == 0;
ArrayChecker<ptr>::element_type == char;
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог