gpt4 book ai didi

c++ - 修复对象初始化以便调用覆盖方法

转载 作者:行者123 更新时间:2023-11-28 01:18:17 24 4
gpt4 key购买 nike

我有什么(简化版):

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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com