Передача другого класса среди экземпляров

Мне было интересно, что является лучшей практикой ре. Передача (другой класс) среди двух экземпляров одного и того же класса (давайте назовем это «Первичный»). Итак, по существу, в конструкторе для первого я могу инициализировать внешний экземпляр (давайте назовем это «Shared») - и затем установить его на определенное значение, пока я обрабатываю этот класс в main ().

Так что «Shared», может быть, int, скажем, 999 к настоящему времени.

А что если я создам еще один экземпляр основного класса "Primary"? Какой лучший способ получить доступ к уже инициализированному внешнему экземпляру Shared - потому что, если я не обработаю это правильно, конструктор для Primary при повторном вызове просто продолжит работу и создаст еще один экземпляр Shared, и таким образом я теряю значение 999. Я могу думать о некоторых грязных решениях, включающих динамические указатели, и если операторы (просто), но у меня есть ощущение, что может быть более простое, более чистое решение?

9.11.2009 18:57:31
трудно следовать ... вы можете уточнить с некоторым кодом, может быть?
fretje 9.11.2009 19:00:40
Ваш вопрос сбивает с толку. Классы не инициализируются; экземпляры делают. Не могли бы вы пересмотреть свой вопрос, чтобы точнее использовать термины «класс» и «экземпляр»?
Nathan Kitchen 9.11.2009 19:00:46
И старайтесь избегать таких терминов, как «этот класс». Я не могу сказать, имеете ли вы в виду внешний класс или другой экземпляр класса (какими бы они ни были).
Michael Burr 9.11.2009 19:04:16
3 ОТВЕТА
РЕШЕНИЕ

Как я понимаю:

  • У вас есть класс А
  • У вас есть класс B
  • Для всех членов класса A существует один экземпляр класса B

Вы не упомянули, используются ли какие-либо параметры из конструктора A для инициализации B!
Что происходит с параметрами второго A, которые используются для B?
Поэтому мы будем предполагать, что B построен по умолчанию.
Мы также предполагаем, что вам нужно, чтобы экземпляр B был лениво оценен, иначе вы бы просто использовали статический член.

class A
{
    B&   bRef;
    public:
        A()
          :bRef(getLazyB())     // Get a reference to the only B for your object.
        {}                      

    private:
        static B& getLazyB()
        {
            static B instance; // Created on first use
            return instance;   // returned to all users.
        }
};
3
9.11.2009 19:05:50
Тем не менее, это приводит к появлению синглтона, который будет иметь проблемы с потоками и тестированием. Также вы не можете отправить параметры его конструктору. Это зависит от деталей, что вам нужно
user151019 9.11.2009 19:16:44
@Mark: Да, это абсолютное упрощенное демо представляет Singelton. Но в среде tdd очень просто превратить getLazyB () в фабрику для генерации подходящего объекта. Но я считаю, что обычно лучше отвечать на один вопрос за раз. Не пытайтесь объяснить весь C ++ одним махом.
Martin York 9.11.2009 19:25:50
@Martin - не нужно использовать один мах; не стесняйтесь использовать 2 или 3 слота для комментариев, чтобы объяснить весь C ++.
Michael Burr 9.11.2009 20:06:32
C -> C ++ -> RAW Pointers -> Smart Pointers -> RAII (Готово)
Martin York 9.11.2009 22:39:19

Заставьте конструктор взять указатель или ссылку на общий класс. Это легче построить снаружи.

class Shared;

class Same
{
    shared& shared_;

    Same( Shared& s ) { shared_ = s; }
}

С подходящим использованием const и других конструкторов и т. Д.

2
9.11.2009 19:04:05
Если вы хотите иметь ссылки на общий экземпляр класса, нужно решить вопрос о том, кто отвечает за очистку Sharedэкземпляра объекта? Это один из Sameпримеров или что-то совсем другое? Нет единственно правильного ответа - но это то, что нужно учитывать при разработке совместного использования.
Michael Burr 9.11.2009 19:06:49

Это зависит от семантики ваших классов. Если внешний класс не является действительно внешним, но некоторые неясные детали реализации, которые, как оказалось, совместно используются экземплярами, передают первый экземпляр в конструктор второго экземпляра и получают ссылку на внешний экземпляр там.

Если внешний класс действительно является внешним классом со своим собственным значением, создайте его снаружи и передайте его конструктору, как предложил Марк.

Если не только два конкретных экземпляра, но и все экземпляры совместно используют один и тот же экземпляр внешнего класса, подумайте о том, чтобы сделать его статическим членом класса, как предложил Мартин Йорк.

0
9.11.2009 19:07:15