c++ - 修复对象初始化,以便调用覆盖的方法
问题描述
我有什么(简化版):
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 受保护等等)。
解决方案
你不能。
在基础的构建过程中,派生的子对象还不存在。
您可以尝试创建一个工厂函数,该函数控制创建Property
s. 然后它可以一步实例化,并在第二步中注册。根据需要使工厂功能friend
和所有相关的机器都不是private
。
推荐阅读
- typescript - 是否可以使用 ts-jest / jest 监视通用函数并在 Typescript 环境中模拟返回值?
- postgresql - Micronaut Data 的级联持久化不保存子对象
- c# - 尝试在 Visual Studio 中测试从 SQLite 数据库加载数据后出现“System.NullReferenceException”
- c++ - 最大 malloc 大小低于预期
- r - r - 根据三列的条件填充新列
- ios - IOS:仅当远程图像未更改时才缓存 SDWebImage
- datatables - 蒲公英数据表导出到excel不起作用
- node.js - 使用 sendUsersMessages(javascript 开发工具包)时 TemplateConfiguration 出现 AWS Pinpoint 错误
- macos - Qt 5.12 Mac OS 丑陋字体渲染
- c# - Unity - WaitForSeconds 在更新或循环中不起作用