Swig и классы C++ с подсчетом ссылок

Многие из моих объектов C++ реализуют подсчет ссылок с помощью методов AddRef и FreeRef. Если FreeRef уменьшает счетчик ссылок до 0, объект удаляет себя.

Все методы, которые возвращают объект с подсчетом ссылок, не увеличивают ссылку. Это делает его простым, поскольку интеллектуальный указатель может затем просто увеличивать счетчик при получении указателя и уменьшать счетчик, когда он больше не ссылается на него. например:

template<class T> FlPtr
{
    T *p;
public:
    FlPtr(T *p=0):p(p){if(p)p->AddRef();}
    ~FlPtr(){if(p)p->FreeRef();}

    FlPtr<T>& operator =(T *newP)
    {
        if(newP)newP->AddRef();
        if(p)p->FreeRef();
        p = newP;
        return *this;
    }
    operator T*(){return p;}
};

Я подумал, может быть, если бы я мог сказать SWIG просто использовать мой существующий интеллектуальный указатель внутри для этих объектов, которые могут работать, однако я тоже не уверен, как это сделать :(


person Fire Lancer    schedule 12.03.2009    source источник


Ответы (1)


Ознакомьтесь с документацией SWIG. По сути, если у вас есть класс Foo и вы хотите обернуть его интеллектуальным указателем Bar, вы делаете это:

%ignore Foo;
class Foo {
    ...
};

class Bar {
public:
    Foo *operator->();
    ...
}

Теперь, когда вы пытаетесь получить доступ к членам экземпляра Bar, он будет внутренне использовать Foo, но это будет совершенно прозрачно.

person Zifre    schedule 13.04.2009