С++ разделяет одну переменную среди нескольких экземпляров объекта

Есть ли способ поделиться одной переменной (объектом класса) с несколькими экземплярами другого класса? Статический член - это не то, что я ищу. Я знаю, что одна переменная (большой объект) будет использоваться несколькими экземплярами (но не всеми). Как я могу сделать это на С++? Спасибо за любую помощь.

Пример:

class ClassA {
public:
   ...
private:
   ClassB object; // this variable will be shared among more instances of ClassA
}

person P.N.    schedule 05.03.2018    source источник
comment
Вы можете сохранить указатель на объект. Вместо ClassB object у вас будет ClassB *object.   -  person Daniel Marques    schedule 06.03.2018
comment
Лучше всего использовать std::shared_pointer, чтобы не знать, когда его удалять.   -  person Barmar    schedule 06.03.2018
comment
Что вы имеете в виду под большим количеством случаев?   -  person llllllllll    schedule 06.03.2018
comment
@Barmar Откуда ты знаешь, что его нужно удалить?   -  person    schedule 06.03.2018
comment
@NeilButterworth Если он используется динамически, его, вероятно, нужно создавать динамически, а затем, скорее всего, его необходимо удалить, когда все эти объекты исчезнут.   -  person Barmar    schedule 06.03.2018
comment
@Barmar В равной степени вероятно, что это какой-то статический объект, используемый обычным указателем или ссылкой (обратите внимание, я знаю, что член не является статическим).   -  person    schedule 06.03.2018
comment
@NeilButterworth Возможно, правда. В равной степени я подозреваю, что нет.   -  person Barmar    schedule 06.03.2018
comment
@NeilButterworth shared_ptr тоже будет работать с указателями на статические? Так мало вреда.   -  person Barmar    schedule 06.03.2018
comment
@Barmar Как будет работать shared_ptr для статически выделенного объекта?   -  person    schedule 06.03.2018
comment
@NeilButterworth stackoverflow.com/questions /41751514/   -  person Barmar    schedule 06.03.2018
comment
@Barmar В ответе, за который проголосовали, говорится, что неправильно использовать shared_ptr для управления статическими объектами. Очевидно, что у вас может быть shared_ptr с ничего не делающим средством удаления, но тогда у вас будет обычный указатель, так зачем вам это делать?   -  person    schedule 06.03.2018
comment
@Barmar Почти всегда ошибка проектирования заключается в том, чтобы иметь shared_ptr, unique_ptr или любой другой умный указатель на объект, который на самом деле не принадлежит.   -  person curiousguy    schedule 06.03.2018
comment
одна переменная (большой объект) будет совместно использоваться несколькими экземплярами какими? пожалуйста, опишите его срок службы; кто несет ответственность за его строительство; и т. д.   -  person curiousguy    schedule 06.03.2018


Ответы (3)


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

class ClassA {
public:
   // ...
private:
   std::shared_ptr<ClassB> object; // this variable will be shared among more instances of ClassA
};
person StoryTeller - Unslander Monica    schedule 05.03.2018
comment
А что, если я знаю, что этот объект ClassB не изменится, и я просто прочитаю его? Это как-то помогает? - person P.N.; 06.03.2018
comment
@П.Н. - Ну, тогда вы можете держать shared_ptr<const ClassB>. Что даже звучнее. Но общий указатель вам все равно нужно будет удерживать. - person StoryTeller - Unslander Monica; 06.03.2018
comment
Переменная object не является общей — может быть то, на что она указывает. И как инициализируется или назначается переменная object? Я думаю, что это довольно плохой ответ на вопрос ОП. И посмотрите мои комментарии выше о том, уместен ли здесь общий указатель. - person ; 06.03.2018

Вы можете использовать указатели.

class B { ... }

class A {
    ...
    B *b;
    ...
}

main() {
    A a1, a2;
    B *b1 = new B();

    a1.b = b1;
    a2.b = b1;
}

Таким образом, элемент b как в a1, так и в a2 ссылается на один и тот же объект.

person freddieRV    schedule 05.03.2018
comment
Не знал о std::shared_ptr. И, как утверждает @StoryTeller в своем ответе, было бы очень сложно отслеживать, какие объекты ссылаются на один и тот же объект, а также знать, когда нужно удалить указанный объект, на который ссылаются. - person freddieRV; 06.03.2018
comment
не забывайте о том, как вы удалите его, когда закончите. особенно, если это делается в разных объемах. - person NathanOliver; 06.03.2018
comment
В этом суть shared_ptr -- когда удаляется последняя ссылка на общий указатель, объект, на который он указывает, удаляется. - person Barmar; 06.03.2018

Я думаю, что std::shared_ptr может быть тем, что вам нужно. В этом случае ваш код будет примерно таким:

class ClassA {

public:
   ...
private:
   std::shared_ptr<ClassB> object; // this variable will be shared among more  instances of ClassA
}

Но вам нужно будет определить, где создается экземпляр этого указателя, это зависит от ваших потребностей. Возможно, вы могли бы предоставить больше контекста для вашего вопроса, например:

  • Откуда взялся ObjectB, принадлежит ли он другому лицу?
  • Как он распространяется на экземпляры ObjectA?
person MarxNotDead    schedule 05.03.2018