我有一个带有构造函数的类 Property
,我想要其中的默认参数,位于文件 property.h
中:
class Property {
Property(OtherClass* value = myApp->someValue) {...};
};
其中,另一种类型 Application
的 myApp
是在另一个广泛使用此 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 )。
如何让这个默认参数起作用? (即,不是另一种解决方案,不会涉及没有默认参数,告诉我默认参数是邪恶的,或者我的设计一开始就很糟糕等等;))。谢谢!
最佳答案
值得注意的是,函数形参的默认参数是在调用函数的地方解析的(与定义函数的位置相反)。这为解决 OP 问题提供了必要的空间 yet another level of indirection :
引入了一个辅助函数,而不是访问myApp->someValue
,该函数可以在Property
定义之前声明,但在Application
之后实现> 已完全定义。 (这也可以是 Property
的 static
成员函数。)
演示示例:
#include <iostream>
int getAppDefault();
struct Application;
extern Application *pApp;
struct Property {
int value;
Property(int value = getAppDefault()): value(value) { }
};
struct Application {
int valueDefault = 123;
};
Application app;
Application *pApp = &app;
int getAppDefault() { return pApp->valueDefault; }
int main()
{
Property prop1;
std::cout << "prop1: " << prop1.value << '\n';
app.valueDefault = 234;
Property prop2;
std::cout << "prop2: " << prop2.value << '\n';
}
输出:
prop1: 123
prop2: 234
为了强调 value = getAppDefault()
实际上是在调用构造函数 Property::Property()
时解析的,我修改了 Application::valueDefault
在默认构造 prop2
之前。
当然,如果Property
存储的是指针而不是值本身,这也同样有效:
关于c++ - 默认参数和前向声明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69478707/