C++函数的默认参数值应该在头文件还是.cpp源文件中指定?

122

我有点新手,不太会C++。我在设置头文件时遇到了麻烦。以下是 functions.h 的内容。

extern void apply_surface(int, int, SDL_Surface *, SDL_Surface *,SDL_Rect *);

这是来自functions.cpp文件的函数定义。

void
apply_surface(int x, int y, SDL_Surface * source, SDL_Surface *
destination,SDL_Rect *clip = NULL)
{
    ...
}

这是我在 main.cpp 中使用它的方式。

#include "functions.h"
int
main (int argc, char * argv[])
{
    apply_surface(bla,bla,bla,bla); // 4 arguments, since last one is optional.
}

但是这个代码不能编译,因为 main.cpp 不知道最后一个参数是可选的。我该如何让它工作?


你尝试过添加到头部吗? - PlasmaHH
4个回答

175

你需要在声明中(即头文件functions.h中)包含可选参数,而不是在定义中(functions.cpp)。

//functions.h
extern void apply_surface(int, int, SDL_Surface *, SDL_Surface *,SDL_Rect * clip = NULL);

//functions.cpp
void apply_surface(int x, int y, SDL_Surface * source, SDL_Surface *
destination,SDL_Rect *clip /*= NULL*/)
{
    ...
}

12
声明指的是头部中的一部分。 - Björn Pollex
谢谢,还有@BjörnPollex!这对我很有帮助。 - M.Ionut
这是我在设置空的C++应用程序时经常混淆的事情,我真的需要开始使用默认应用程序设置。 - clockw0rk

24

默认参数值应该在函数声明(functions.h)中定义,而不是在函数定义(function.cpp)中定义。


3

使用:

extern void apply_surface(int, int, SDL_Surface *, SDL_Surface *,SDL_Rect * = NULL);

(注意我这里无法检查;附近没有编译器。)


-4

很奇怪,如果我有一个没有默认参数的虚函数,然后在.h文件中有没有默认参数的继承者,然后在它们的.cpp文件中有默认参数,那么对我来说它可以正常工作。就像这样:

// in .h
class Base {virtual void func(int param){}};
class Inheritor : public Base {void func(int param);};
// in .cpp
void Inheritor::func(int param = 0){}

抱歉格式不太好


1
这并没有回答问题。一旦您拥有足够的声望,您将能够评论任何帖子;相反,提供不需要询问者澄清的答案。- 来自审核 - BobMorane

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接