【发布时间】:2021-10-07 09:28:31
【问题描述】:
我有一个类Property,在文件property.h 中有一个我想要默认参数的构造函数:
class Property {
Property(OtherClass* value = myApp->someValue) {...};
};
其中myApp,另一个类型Application,在另一个文件中定义,该文件广泛使用了这个Property 类。由于这个其他文件#includes property.h,当然,我不能在property.h中#include这个文件
property.h 不知道myApp 也不知道Application(尽管property.cpp 知道,并且OtherClass 在property.h 中已知)。
我可以转发声明OtherClass 并将myApp 声明为extern,但这会导致错误C2027“使用未定义类型的应用程序”,正如预期的那样:
class Application;
extern Application* myApp;
class Property {
Property(OtherClass* value = myApp->someValue) {...};
};
解决方案可能是在 .cpp 文件中使用默认参数,但不建议这样做 (here)。
我怎样才能让这个默认参数工作? (即,没有另一种解决方案涉及没有默认参数告诉我默认参数是邪恶的,或者我的设计一开始就很差等;))。谢谢!
【问题讨论】:
-
大多数问题都可以通过另一个层次的间接来解决。进行一个在
.cc中实现的函数调用,其中Application是已知的。 (尝试制作一个 MCVE 来检查一下...)
标签: c++ forward-declaration default-arguments