Я разрабатываю библиотеку с некоторыми классами, назовем их C1, C2 and ... Cn
. Каждый из этих классов реализует некоторые интерфейсы, то есть I1, I2, ... Im.
(n > m). Отношения между объектами в библиотеке сложны, и я должен предоставить некоторый API для пользователей моей библиотеки для доступа к этим объектам с помощью интеллектуальных указателей.
После некоторых обсуждений я пришел к выводу, что возвращать общие указатели пользователям библиотеки — не лучшая идея, потому что в этом случае я не могу быть уверен, что объект может быть удален именно в памяти моей библиотеки. Возврат слабых указателей имеет ту же проблему, потому что, если пользователь API .lock()
s слабый указатель и сохранит где-то полученный общий указатель, я снова столкнусь с той же проблемой.
Последняя идея, которая у меня есть, состоит в том, чтобы предоставить какие-то обертки для слабых указателей. Класс-оболочка может быть примерно таким:
class Wrapper_C1 : public I1
{
std::weak_ptr<C1> mC1;
public:
Wrapper_C1() = delete;
Wrapper_C1(const std::weak_ptr<C1> & c1) : mC1(c1)
{
}
int method1_C1(int x)
{
if (auto sp = mC1.lock())
{
sp->method1_C1(x);
}
else
{
throw std::runtime_error("object C1 is not loaded in the lib.");
}
}
void method2_C1(double y)
{
if (auto sp = mC1.lock())
{
sp->method2_C1(y);
}
else
{
throw std::runtime_error("object C1 is not loaded in the lib.");
}
}
// The same for other methods
};
Как видите, все эти классы-оболочки имеют одну и ту же реализацию. Каков наилучший способ уменьшить код ВСЕХ этих классов-оболочек? Есть ли способ избежать повторения одинаковых кодов?
__declspec(propety
.... это может позволить геттеру (проверка) и сеттеру (регистрация), все еще делая '.' возможен синтаксис - для этого потребуется как минимумclang
или msvc - person darune   schedule 23.10.2019dlsym
/LoadLibrary
)? Затем вы можете предоставить оболочку, чтобы обеспечить время жизни объекта/библиотеки. - person Jarod42   schedule 23.10.2019