如何在c ++中将默认参数设置为类对象?

时间:2012-08-25 11:45:10

标签: c++

我想将类对象参数设置为默认设置我的函数。但是当我尝试这样做时,编译失败了。

class base {
 // ...
};

int myfunc(int a, base b = NULL) {
    if (NULL = b) {
        // DO SOMETHING
    } else {
    // DO SOMETHING
    }
}

这里当我试图编译它时,这给了我“默认参数base b有int类型”的错误

4 个答案:

答案 0 :(得分:19)

C ++中的对象不能是NULL

要将参数设置为默认值,只需使用:

int myfunc(int a, base b = base())

答案 1 :(得分:14)

这里有三个明显的选择。

首先,使用重载,以便调用者可以选择是否传递b

int myfunc(int a) { ... }
int myfunc(int a, base& b) { ... }

这样您就可以传递b而无需使用指针。请注意,您应该使b成为引用或指针类型,以避免使用slicing对象。

其次,如果您不想要2个单独的实现,请使b成为指针,可以将其设置为NULL

int myfunc(int a, base* b = NULL) { ... }

第三,您可以使用某些东西来封装可空的概念,例如boost::optional

int myfunc(int a, boost::optional<base&> b = boost::optional<base&>()) { ... }

答案 2 :(得分:1)

@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();
}

答案 3 :(得分:0)

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();
}

但是,运行此操作会由于取消引用空指针而直接给您带来分段错误。我不确定什么时候有用。