我想将我的函数设置为默认的类对象参数。但是当我尝试这样做时,它在编译中失败了。
class base {
// ...
};
int myfunc(int a, base b = NULL) {
if (NULL = b) {
// DO SOMETHING
} else {
// DO SOMETHING
}
}
在这里,当我尝试编译它时,这给了我“默认参数基 b 具有 int 类型”的错误
我想将我的函数设置为默认的类对象参数。但是当我尝试这样做时,它在编译中失败了。
class base {
// ...
};
int myfunc(int a, base b = NULL) {
if (NULL = b) {
// DO SOMETHING
} else {
// DO SOMETHING
}
}
在这里,当我尝试编译它时,这给了我“默认参数基 b 具有 int 类型”的错误
对象不能NULL
在 C++ 中。
要将参数设置为默认值,只需使用:
int myfunc(int a, base b = base())
您在这里有三个明显的选择。
首先,使用重载,以便调用者可以选择是否通过b
。
int myfunc(int a) { ... }
int myfunc(int a, base& b) { ... }
这样您就可以通过b
而无需使用指针。请注意,您应该创建b
引用或指针类型以避免对对象进行切片。
其次,如果您不想要 2 个单独的实现,请创建b
一个指针,可以将其设置为NULL
.
int myfunc(int a, base* b = NULL) { ... }
第三,您可以使用一些东西来封装可为空的概念,例如boost::optional
.
int myfunc(int a, boost::optional<base&> b = boost::optional<base&>()) { ... }
@tenfour答案忘了提及另一种可能的方式。您还可以定义一个可以随意构造的全局变量对象,然后将其设置为默认值:
#include <iostream>
class MyCustomClassType
{
int var;
friend std::ostream &operator<<(
std::ostream &output, const MyCustomClassType &my_custom_class_type )
{
output << my_custom_class_type.var;
return output;
}
};
// C++11 syntax initialization call to the default constructor
MyCustomClassType _my_custom_class_type{};
void function(MyCustomClassType my_custom_class_type = _my_custom_class_type) {
std::cout << my_custom_class_type << std::endl;
}
/**
* To build it use:
* g++ -std=c++11 main.cpp -o main
*/
int main (int argc, char *argv[]) {
function();
}
一个hack或丑陋的解决方案是从null进行静态转换:
#include <iostream>
class MyCustomClassType {
int var;
friend std::ostream &operator<<(
std::ostream &output, const MyCustomClassType &my_custom_class_type )
{
output << my_custom_class_type.var;
return output;
}
};
void function(
MyCustomClassType my_custom_class_type = *static_cast<MyCustomClassType*>( nullptr )
)
{
std::cout << my_custom_class_type << std::endl;
}
/**
* To build it use:
* g++ -std=c++11 main.cpp -o main
*/
int main (int argc, char *argv[]) {
function();
}
但是,由于取消引用空指针,运行它会直接给您带来分段错误。我不确定这什么时候有用。