How to set default parameter as class object in c++?

前端 未结 4 701
萌比男神i
萌比男神i 2020-12-30 07:08

I want to set my function with class object parameter set as default. But when I try to do that it fails in compilation.

class base {
 // ...
};

int myfunc(         


        
相关标签:
4条回答
  • 2020-12-30 07:43

    Objects can't be NULL in C++.

    To set the parameter to default, just use:

    int myfunc(int a, base b = base())
    
    0 讨论(0)
  • 2020-12-30 07:52

    You have three obvious options here.

    First, use overloads so the caller can choose to pass b or not.

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

    This way you can pass b without having to use a pointer. Note that you should make b a reference or pointer type to avoid slicing the object.

    Secondly, if you don't want 2 separate implementations, make b a pointer, which can be set to NULL.

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

    Third, you could use something to encapsulate the concept of nullable, such as boost::optional.

    int myfunc(int a, boost::optional<base&> b = boost::optional<base&>()) { ... }
    
    0 讨论(0)
  • 2020-12-30 07:53

    @tenfour answer forgot to mention another possible way. You also define a global variable object which you can construct as you like, then set it as the default value:

    #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();
    }
    
    0 讨论(0)
  • 2020-12-30 07:55

    A hack or ugly solution would be do a static cast from 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();
    }
    

    But, running this gives you directly a segmentation fault due dereferencing a null pointer. I am not sure when this would be useful.

    0 讨论(0)
提交回复
热议问题