Передача другого класса среди экземпляров - PullRequest
0 голосов
/ 09 ноября 2009

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

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

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

Ответы [ 3 ]

3 голосов
/ 09 ноября 2009

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

  • У вас есть класс A
  • У вас есть класс 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.
        }
};
2 голосов
/ 09 ноября 2009

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

class Shared;

class Same
{
    shared& shared_;

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

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

0 голосов
/ 09 ноября 2009

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...