У меня есть 3 разных класса (A, B, C), каждый из которых имеет shared_ptr для общего объекта (объект X). Я хочу сделать, чтобы предоставить объекту X информацию о том, кто указывает на него. Например, если бы не было объектов A, указывающих на него, нет необходимости вычислять данные, которые используются только классами A при его обновлении. И объект X может содержать вектор указателей на объекты C, которые указывают на него, чтобы он мог вызывать функцию на них, когда некоторые данные, относящиеся к объектам C, были обновлены (но объекты C по-прежнему указывают на него, чтобы запрашивать другие данные из него).Объект, который знает, кто указывает на него
Что я собираюсь сделать, это создать класс-оболочку для shared_ptr для каждого класса, который будет вызывать указатели на функции на X всякий раз, когда оболочка будет построена/назначена/уничтожена (все те же случаи, которые увеличивают/уменьшают ссылочную считать на X). Вот идея в коде:
class A
{
public:
A() : m_ptr(&X::IncrementACount, &X::DecrementACount) { }
void SetX(const std::shared_ptr<X> &ptr) { m_ptr = ptr; }
private:
shared_ptr_wrapper0<X> m_ptr;
};
class B
{
public:
B() : m_ptr(&X::IncrementBCount, &X::DecrementBCount) { }
void SetX(const std::shared_ptr<X> &ptr) { m_ptr = ptr; }
private:
shared_ptr_wrapper0<X> m_ptr;
};
class C
{
public:
C() : m_ptr(this, &X::StoreCPointer, &X::RemoveCPointer) { }
void SetX(const std::shared_ptr<X> &ptr) { m_ptr = ptr; }
private:
shared_ptr_wrapper1<X, const C*> m_ptr;
};
А и В имеют обернутый интеллектуальный указатель с/декремента функции Increment уточнил, что не принимают никаких аргументов. Когда обернутый смарт-указатель получает set/cleared/etc, эти функции будут вызываться на содержащем его объекте X и увеличивать/уменьшать счетчики A/B.
C имеет завернутый смарт-указатель с одним аргументом (типа const C *). Когда он получает set/cleared/etc, функции на нем будут вызываться с данными, которые были сохранены на нем конструктором C (этим указателем), и будут добавлять или удалять его из вектора на объекте X.
So мой главный вопрос - это хорошая идея? Есть ли лучший способ достичь этой идеи, чтобы отслеживать, кто указывает на объект? Есть ли конкретное имя для такого типа идеи (я не могу себе представить, что я первым попробую что-то подобное, но я не нашел ничего, когда искал его, поэтому, возможно, я просто не знаю правильного имени для искать ...)
спасибо.
Это невероятно глупо, запутанно и что он должен решить? –
Если вы просто отслеживаете, если объекты _some_ типа 'A' или' B' имеют ссылки на объекты типа 'C', я должен думать, что вы можете хранить простой _count_ объектов' A' или 'B' которые имеют ссылки в объекте 'C', а _ только_' C'-объект. Почему «A» и «B» должны отслеживать это от имени «C»? – sarnold
(Кстати, мне нравится ядро _idea_ вычисления только того, что необходимо для клиентов объектов, эта конкретная реализация чувствует, что она отслеживает слишком много данных в неправильных местах, но, возможно, я неправильно прочитал ее.) – sarnold