当构造函数用作默认参数时,如何定义和声明结构?

时间:2019-02-13 17:58:03

标签: c++ struct header declaration

我里面有一个.h文件,我有一个函数,该函数使用Struct / Class构造函数作为默认参数。

它出现在声明的结尾,就像在这里回答:Where to put default parameter value in C++?

函数声明

vector<UINT_PTR> scan(const ScanOptions& scan_options = ScanOptions());

结构定义

struct ScanOptions {

ScanOptions()
{
    //Use some Windows.h functions here to find values
    SYSTEM_INFO sysinfo;
    GetSystemInfo(&sysinfo);
    start_address = sysinfo.lpMinimumApplicationAddress;
    end_address = sysinfo.lpMaximumApplicationAddress;

}

UINT_PTR start_address;
UINT_PTR end_address;
};

在这里回答:

  

该文件的私有结构应放在.c文件中,如果.h中的任何功能使用它们,则在.h文件中带有声明。

Should struct definitions go in .h or .c file?

似乎没有办法只声明结构来向前声明它?

C++, how to declare a struct in a header file

那么我是将结构的声明和定义保留在标头中还是有其他建议的方法?

我的意思是,自从它开始运作以来,我并不十分在意它的全球化,我也不认为它会导致问题,但是我真的想知道。

1 个答案:

答案 0 :(得分:2)

如果您使用

vector<UINT_PTR> scan(const ScanOptions& scan_options = ScanOptions());
在.h文件中

,则ScanOptions的定义必须在函数声明时可见。

但是,您可以重载该函数,而不是使用默认参数。

vector<UINT_PTR> scan();
vector<UINT_PTR> scan(const ScanOptions& scan_options);

理解第一个函数将使用默认构造的ScanOptions来完成其工作。进行此更改后,您可以在.h文件中转发声明ScanOptions并仅在.cpp文件中定义它。

以下内容完全正确,不需要在{.h文件中包含ScanOptions的定义。

struct ScanOptions;

vector<UINT_PTR> scan();
vector<UINT_PTR> scan(const ScanOptions& scan_options);