c++ - 默认参数和前向声明

标签 c++ forward-declaration default-arguments

我有一个带有构造函数的类 Property,我想要其中的默认参数,位于文件 property.h 中:

class Property {
  Property(OtherClass* value = myApp->someValue) {...};
};

其中,另一种类型 ApplicationmyApp 是在另一个广泛使用此 Property 类的文件中定义的。由于这个其他文件#includes property.h,当然,我不能在property.h中#include这个文件

property.h 不知道 myApp 也不知道 Application (尽管 property.cpp 知道,并且 OtherClassproperty.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之后实现> 已完全定义。 (这也可以是 Propertystatic 成员函数。)

演示示例:

#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

Demo on coliru

为了强调 value = getAppDefault() 实际上是在调用构造函数 Property::Property() 时解析的,我修改了 Application::valueDefault 在默认构造 prop2 之前。


当然,如果Property存储的是指针而不是值本身,这也同样有效:

Demo on coliru

关于c++ - 默认参数和前向声明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69478707/

相关文章:

c++ - 如何知道 sigsetjmp 或 siglongjmp 是否失败?

bash - Bash 或 Shell 脚本中的转发函数声明?

c - 为什么在 C 中不强制声明具有 int 返回类型的函数?

C++如何使用其中也包含此类的类中的枚举

delphi - 元类默认参数值 (Delphi 2009)

c++ - 如何访问 USB 电视调谐卡等 BDA 设备

c++ - 自动铸件

python - 如何输入可变的默认参数

c++ - 未使用默认参数

C++:导致数字在成功某个值时溢出并从零开始?