Want to protect your cyber security and still get fast solutions? Ask a secure question today.Go Premium

x
  • Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 163
  • Last Modified:

Declare a method with default arguments in C++ ( array of string)

Hi Experts,

I have the following method :

void  setState (std::string reason, bool bAfter, std::list<std::string>& allStates);

Is there a way to declare it with default arguments for bool and std::list<std::string> ?

so that I can call it in some places of my code

setState("shutdown");


Thanks,
0
bachra04
Asked:
bachra04
1 Solution
 
jkrCommented:
You can't provide a default argument for a 'std::list<std::string>&', since there is no NULL value for references. But why not just providing a 2nd overload for 'setState()' that only takes one argument, e.g.

void  setState (std::string reason, bool bAfter, std::list<std::string>& allStates);

// ...

void  setState (std::string reason) {

  std::list<std::string> empty_list;

  setState(reasob, true, empty_list); // call original 'setState()' with an empty list
}

Open in new window

0
 
phoffricCommented:
Maybe you can handle a "null" list by checking for an empty list:
std::list<std::string> defaultStates;

void  setState (std::string reason, bool bAfter = false, std::list<std::string>& allStates = defaultStates) {
   std::cout << reason << " bAfter = " << bAfter;
   if( !allStates.empty() )
   {
      std::cout << "  " << allStates.back();
      std::cout << "  " << allStates.front();
   }
   std::cout << std::endl;
}

int main() {
   defaultStates.push_back ("ON");
   defaultStates.push_back ("OFF");
   setState("default");
   defaultStates.push_front("the end");
   setState("actual ", true, defaultStates);
}

Open in new window

0
 
jkrCommented:
BTW, as a side note - you might want to consider passing the 'reason' parameter as a 'string&', too. That will avoid copying the string at each call. And also consider making it 'const'. E.g.

void  setState (const std::string reason, bool bAfter, std::list<std::string>& allStates);

// ...

void  setState (const std::string& reason) {

  std::list<std::string> empty_list;

  setState(reasob, true, empty_list); // call original 'setState()' with an empty list
}
                                          

Open in new window

0
What does it mean to be "Always On"?

Is your cloud always on? With an Always On cloud you won't have to worry about downtime for maintenance or software application code updates, ensuring that your bottom line isn't affected.

 
jkrCommented:
>>Maybe you can handle a "null" list by checking for an empty list:

Which means that you still have t pass an empty list that has to be declared and instantiated. Does not make that very elegant to handle...
0
 
phoffricCommented:
I expect that the author has a reason for wanting to pass in a default list. Personally, I rarely use defaults because once you start, it never ends, and then I think, for others, reading the code becomes a little harder in tracking down whether an overload was called or whether a function with default values was called.
0
 
Subrat (C++ windows/Linux)Software EngineerCommented:
In my opinion, just to achieve the default argument feature, we are creating a global list object or might be a data member. Which is totally unnecessary.
Better approach would be the calling 3-arg version from overloaded 1-arg version as told by JKR-(ID: 40459561).
0
 
phoffricCommented:
I would expect that the author already has some object that represents what is desired to be the default value for the preponderance of cases. We are creating a global list object just to show how to address the author's question.
0
 
sarabandeCommented:
the following compiles without problems:

void  setState (std::string reason, bool bAfter = false, std::list<std::string>& allStates = std::list<std::string>())
{
    if (std::find(allStates.begin(), allStates.end(), reason) != allStates.end())
    {
        allStates.push_back(reason);
    }
}

Open in new window

so if you want a "default" which does nothing you can do it without defining a global list.

of course a "global" states list as suggested by phoffric makes more sense. you probably would provide the list by using a static get function like that:

class Global  // or use any other class ...
{
     static std::list<std::string> & getAllStates()
     {
           static std::list<std::string> allStates;
           return allStates;
     }
     ...
};

Open in new window

you could use it like:

void setState (std::string reason, bool bAfter = false, std::list<std::string>& allStates = std::list<std::string>())
{
    if (allStates.empty() == true)
    {
          allStates = Global::getAllStates();
    }
    if (std::find(allStates.begin(), allStates.end(), reason) != allStates.end())
    {
        allStates.push_back(reason);
    }
}

Open in new window


Sara
0
 
bachra04Author Commented:
Thanks Sara;

It is also a nice suggestion.
0

Featured Post

Free Tool: SSL Checker

Scans your site and returns information about your SSL implementation and certificate. Helpful for debugging and validating your SSL configuration.

One of a set of tools we are providing to everyone as a way of saying thank you for being a part of the community.

Tackle projects and never again get stuck behind a technical roadblock.
Join Now