2010-11-08 24 views
10

No he podido resolver esto. Es fácil crear dos ctors, pero quería aprender si hay una manera fácil de hacerlo.Cómo pasar std :: map como parámetro de constructor predeterminado

¿Cómo se puede pasar un std::map como parámetro predeterminado a un ctor, p.

Foo::Foo(int arg1, int arg2, const std::map<std::string, std::string> = VAL) 

He intentado 0, null y NULL como VAL, ninguno de los trabajos porque son todos de tipo int, g ++ se queja. ¿Cuál es el valor predeterminado correcto para usar aquí?

¿O este tipo de cosas no es una buena idea?

Respuesta

22

La expresión correcta para VAL es std::map<std::string, std::string>(). Creo que se ve larga y desagradable, así que probablemente añadiría un miembro de typedef público a la clase:

class Foo { 
public: 
    typedef std::map<std::string, std::string> map_type; 
    Foo(int arg1, int arg2, const map_type = map_type()); 
    // ... 
}; 

Y, por cierto, quisiste decir para el último argumento del constructor para ser una referencia? const map_type& es probablemente mejor que solo const map_type.

+5

+1 por ser la única solución que poner el valor por defecto en la declaración * * y no en el *definición*. –

5

Crea un valor temporal inicializado. Por ejemplo:

Foo::Foo(int arg1, 
     int arg2, 
     const std::map<std::string, std::string>& the_map = 
      std::map<std::string, std::string>()) 
{ 
} 

(un typedef podría ayudar a hacer que esto sea más legible en su código)

2

En primer lugar, y tangentailly, que están pasando el mapa valor const, que no tiene sentido y probablemente no lo que realmente quieres Probablemente quiera pasar por const referencia, para que no haga una copia del mapa, y se asegure de que su función no modifique el mapa.

Ahora, si usted quiere que su parámetro por defecto para ser un mapa vacío, lo haces construyéndolo, así:

Foo::Foo(int arg1, int arg2, const std::map<std::string, std::string>& = std::map<std::string, std::string>()) 
0

Como C++ 11 se puede utilizar aggregate initialization:

void foo(std::map<std::string, std::string> myMap = {}); 

Ejemplo:

#include <iostream> 
#include <map> 
#include <string> 

void foo(std::map<std::string, std::string> myMap = {}) 
{ 
    for(auto it = std::begin(myMap); it != std::end(myMap); ++it) 
     std::cout << it->first << " : " << it->second << '\n'; 
} 

int main(int, char*[]) 
{ 
    const std::map<std::string, std::string> animalKids = { 
     { "antelope", "calf" }, { "ant", "antling" }, 
     { "baboon", "infant" }, { "bear", "cub" }, 
     { "bee", "larva" }, { "cat", "kitten" } 
    }; 

    foo(); 
    foo(animalKids); 

    return 0; 
} 
Cuestiones relacionadas