我有什么(简化版):
template<typename T> class Watcher
{
public:
T* m_watched { nullptr };
Watcher() = default;
Watcher(T* watched) : m_watched(watched) { m_watched->addWatcher(this); };
virtual void notifyChange(int = 0) /*= 0*/{std::cout << "Watcher::notifyChange()\n";};
};
template<typename T> class Watchable
{
public:
std::vector<Watcher<T>*> m_watchers;
virtual void addWatcher(Watcher<T>* watcher)
{
m_watchers.push_back(watcher);
watcher->notifyChange();
}
};
class Config : public Watchable<Config>
{
};
class Property : public Watcher<Config>
{
public:
Property(Config* config) : Watcher<Config>(config) {};
void notifyChange(int = 0) override { std::cout << "Property::notifyChange()\n"; }
};
因此,当我创建基类 (Watcher) 的 Property notifyChange() 实例时,将被调用。
我明白为什么会发生这种情况,但我不知道如何解决这个仍然有适当的现代 C++ 代码(例如,没有使 m_watched protected 等)。
最佳答案
你不能。
在构建基础期间,派生的子对象尚不存在。
您可以尝试创建一个工厂函数,它控制创建 Property
。然后一步实例化,第二步注册。根据需要使工厂函数成为 friend
,并让所有相关机器成为私有(private)
。
关于c++ - 修复对象初始化以便调用覆盖方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57853255/