Это совершенно глупая и неправильная вещь. Вы берете ссылку на локальную переменную функции и сохраняете ее вне области действия функции. Это никогда не могло работать.

мышлялкак Вы можете сделать полиморфизм со ссылками, в отличие от указателей.

Чтобы уточнить, смотрите следующий минимальный пример:

class A;

class B {
  public:
    A& a; ///////////////// <- #1
    B();
    void doStuff();
};

class A {
  public:
    virtual void doSmth() = 0;
};
void B::doStuff() {
  a.doSmth();
}

class A1 : public A {
  public:
    void doSmth() {
    }
};

B::B() : a(
    *        ////////////// <- #2
      (new A1)  /////////// <- #3
     ) {
}

Это компилируется и работает, но самым важным моментом здесь является то, чтоa в линию#1 это ссылка, поэтому, чтобы иметь возможность использовать ее полиморфно (это фактическое слово?), как показано в строке#3 Я должен "преобразовать указатель на ссылку", разыменовав его.

Это кажется мне немного странным, и мне было интересно, есть ли лучшее (в смыслеочиститель) путь. Это только я?

обоснование

Было бы здорово, если бы я не нуждался вnew вообще, но при декларировании (!)B Я понятия не имею, как создать экземплярA1 (!) какA это предварительная декларация -A1 реализован в том же модуле компиляции, что иB, Тем не менее, есть ли реальная потребность в динамическом распределении памяти в этом случае? Как бы вы это сделали?

Извините за слегка двоякий вопрос.

редактировать

Примечание:B огромен (и я не могу сделать из него шаблонный класс), и выйдет из области видимости именно тогда, когда программа завершится -a является небольшим и заставляет два больших модуля общаться друг с другом, это будет необходимо до тех пор, покаB живет (есть только один).

Редактировать 2

Я только что понял, что так какA а такжеB эффективно одиночек, я могу просто создатьstatic экземплярA1 в блоке компиляцииBизбегая динамического выделения памяти (даже если их было дваBs они могли бы легко использовать один и тот же экземплярA). Чтобы быть справедливым, я не опубликовал это как ответ, но приму ответ, который побудил меня придумать эторешение.

Ответы на вопрос(7)

Ваш ответ на вопрос