Вы не должны публиковать this
из конструктора, поскольку ваш объект еще не инициализирован должным образом. В этой реальной ситуации, тем не менее, это кажется безопасным, поскольку вы публикуете его только в базовом классе, который только сохраняет его и не вызывает его до некоторого момента спустя, когда к этому времени строительство будет завершено.
Однако, если вы хотите избавиться от предупреждения, вы можете использовать статический фабричный метод:
struct Base
{
public:
Base() { }
void setInterface(IInterface* inter) { m_inter = inter; }
void SomeFunc() { inter->FuncToCall(); }
IInterface* m_inter;
};
struct Derived : Base, IInterface
{
private:
Derived() : Base() {}
public:
static Derived* createInstance() {
Derived instance = new Derived();
instance->setInterface(instance);
return instance;
}
FuncToCall() {}
};
Обратите внимание, что конструктор Derived
является закрытым, чтобы гарантировать, что создание экземпляра выполняется только через createInstance
.