Первое, что следует отметить, это то, что, поскольку вы определили tpc
как ссылку, она должна быть инициализирована (а не просто назначена), поэтому что-то даже в общем порядке x.tpc = &localtpc;
просто не будет работать .
Что касается того, что будет работать, я вижу (по крайней мере) две очевидные возможности. Один создает единственный экземпляр ThirdPartyClass, а затем инициализирует все объекты X
, чтобы они содержали указатели на этот единственный экземпляр:
// X.h
class X {
ThirdPartyClass &x;
public:
X();
};
// X.cpp
#include "ThirdPartyClass.hpp"
X::X()
: x(holder())
{}
ThirdPartyClass &holder() {
static ThirdPartyClass foo;
return foo;
}
Другая очевидная возможность - использовать new
для создания экземпляра и инициализации вашей ссылки оттуда:
// X.h
class X {
ThirdPartyClass &x;
public:
X();
};
// X.cpp
#include "ThirdPartyClass.hpp"
X::X()
: x(* new ThirdPartyClass)
{}
Что является предпочтительным: это действительно зависит от того, как вы используете вещи. Если вы ожидаете, что все экземпляры x
совместно используют один экземпляр ThirdPartyClass
, поэтому (например) изменение через один должно быть отражено во всех остальных, тогда вы почти наверняка захотите что-то хотя бы немного похожее на первое.
С другой стороны, если ожидается, что каждый экземпляр x
будет иметь уникальный экземпляр ThirdPartyClass
, то вы почти наверняка захотите что-то более похожее на последнее.