2009-05-25 18 views
8

Me gustaría ver cómo este ejemplo de código existente podría aprovechar la función de lista de inicializadores C++ 0x.Ejemplo de la lista de inicializadores C++ 0x

Example0:

#include <vector> 
#include <string> 
struct Ask { 
    std::string prompt; 
    Ask(std::string a_prompt):prompt(a_prompt){} 
}; 
struct AskString : public Ask{ 
    int min; 
    int max; 
    AskString(std::string a_prompt, int a_min, int a_max): 
     Ask(a_prompt), min(a_min), max(a_max){} 
}; 
int main() 
{ 
    std::vector<Ask*> ui; 
    ui.push_back(new AskString("Enter your name: ", 3, 25)); 
    ui.push_back(new AskString("Enter your city: ", 2, 25)); 
    ui.push_back(new Ask("Enter your age: ")); 
} 

¿Sería apoyar algo como esto:

Ejemplo 1:

std::vector<Ask*> ui ={ 
    AskString("Enter your name: ", 3, 25), 
    AskString("Enter your city: ", 2, 25), 
    Ask("Enter your age: ") 
    }; 

o debe tener literales como esto ?:

Ejemplo 2:

std::vector<Ask*> ui ={ 
    {"Enter your name: ", 3, 25}, 
    {"Enter your city: ", 2, 25}, 
    {"Enter your age: "} 
    }; 

En caso afirmativo, ¿cómo se manejaría la diferencia entre AskString y Ask?

Respuesta

9

Los últimos ejemplos no estarían permitidos cuando solicite punteros sino que intente proporcionar objetos temporales locales.

std::vector<Ask*> ui ={ 
    new AskString{"Enter your name: ", 3, 25}, 
    new AskString{"Enter your city: ", 2, 25}, 
    new Ask{"Enter your age: "} 
    }; 

Eso estaría permitido y no habría ningún tipo de ambigüedad.

Eso sería correcto también:

std::vector<Ask*> ui ={ 
     new AskString("Enter your name: ", 3, 25), 
     new AskString("Enter your city: ", 2, 25), 
     new Ask("Enter your age: ") 
     }; 

Y el ejemplo es más como:

std::vector<Ask> ui ={ // not pointers 
    {"Enter your name: "}, 
    {"Enter your city: "}, 
    {"Enter your age: "} 
    }; 

std::vector<AskString> uiString ={ // not pointers 
    {"Enter your name: ", 3, 25}, 
    {"Enter your city: ", 2, 25}, 
    {"Enter your age: ", 7, 42} 
    }; 

y otra vez no habría ninguna ambigüedad acerca de los tipos.

-2

Una lista de inicializadores de C++ es homogénea, lo que significa que debe tener todos del mismo tipo, por lo que el ejemplo n. ° 2 está desactivado. Si usaste new en el ejemplo 1, funcionaría.

+0

Si utiliza std :: vector no podría agregar AskString! – mmmmmmmm

+0

Pensé que AskString era una función que me devolvía un Ask, tonto. – rlbond

+0

Eso está muy mal. AskString es un tipo distinto que utiliza Ask como su clase base. Lo que llamas una función es un constructor. Son cosas muy diferentes. – jmucchiello

Cuestiones relacionadas