В "place1" вам нужна ссылка. Object1
не полностью определен, поэтому вы не можете взять его по значению. Тем не менее, вы не хотели бы передавать по значению; когда вы берете его адрес, вы получите адрес копии, а не фактический объект.
Поскольку вам нужен только указатель на BaseClass
, возможно, имеет смысл поместить это ограничение только на параметр. (Конечно, если вам действительно нужен Object1
, отразите это в виде link
: Object1* link;
).
Также рассмотрите возможность использования списка инициализации:
Object1(int a) : i(a), link(0) /* <- important! */ { }
Object1(int a, BaseClass& o) : i(a), link(&o) { }
Всегда используйте список инициализации.
"place2" создает безымянный экземпляр Object1
, используя конструктор. У него нет памяти (?) auto
памяти, а умирает в конце выражения .
То есть, после того как вы нажали точку с запятой в Object1 a(1, /*place2*/ Object1(2));
, она перестает существовать, и у вас есть указатель на несуществующий объект! Это приводит к неопределенному поведению.
Дайте ему жизнь вне выражения:
Object1 x(2);
Object1 a(1, x);
Всегда проверяйте, что когда вы ссылаетесь на объект, он будет жить все время, пока вы на него ссылаетесь.
Ваша новая ошибка компиляции в том, что вы не можете иметь ссылку на временную переменную. Вы можете иметь тот, у которого есть константная ссылка. Дело в том, что ваш указатель должен указывать на const BaseClass
сейчас, что может ослабить то, что вы хотите.
Опять же, ваш дизайн требует доработки, к сожалению.