Здравствуйте, Denwer, Вы писали:
D>Здравствуйте, Аноним, Вы писали:
D>
А>>Т.е., хотелось бы иметь средства, которые позволят легко расширять (возможно, чужие) библиотеки (для своих нужд) причем, так, чтобы эти расширения и сами библиотеки можно было бы легко сопровождать, и, желательно, независимо друг от друга.
А>>Denwer, я правильно понял?
А>>--
А>>Дмитрий
D>ДА ДА ДА
Хороший способ расширения библиотеки классов — это использование оберток.
Например, пусть у нас есть библиотека классов:
class A
{
public:
void f();
};
class B : public A
{
public:
void g();
};
и ее требуется расширить одной фукцией void h()
template<class T>
class X
{
public:
X(T* _a) : a(_a) {}
void h();
T* operator->()
{
return a;
}
private:
T* a;
};
Использовать такой класс-обертку не сложнее чем обычный класс:
X<A> xa(new A);
xa.h(); // вызов X::h()
xa->f(); // вызов A::f()
X<B> xb(new B);
xb.h(); // вызов X::h()
xb->f(); // вызов A::f()
xb->g(); // вызов B::g()
Конечно в этом случае надо знать, что к методам класса X надо обращаться через '.' а к другим через '->' Но неужели это проблема?!
Доступа к закрытым методам классов A & B тоже не получишь.
Зато дешево, надежно и практично.