Это совершенно глупая и неправильная вещь. Вы берете ссылку на локальную переменную функции и сохраняете ее вне области действия функции. Это никогда не могло работать.
мышлялкак Вы можете сделать полиморфизм со ссылками, в отличие от указателей.
Чтобы уточнить, смотрите следующий минимальный пример:
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
живет (есть только один).
Я только что понял, что так какA
а такжеB
эффективно одиночек, я могу просто создатьstatic
экземплярA1
в блоке компиляцииB
избегая динамического выделения памяти (даже если их было дваB
s они могли бы легко использовать один и тот же экземплярA
). Чтобы быть справедливым, я не опубликовал это как ответ, но приму ответ, который побудил меня придумать эторешение.