2010-12-11 10 views
7

Soy muy nuevo en C++, así que esta podría ser una pregunta fácil de responder. Estoy escribiendo una clase (Persona) y cuando se crea una Persona, se le debe asignar un nombre aleatorio de una colección de nombres predefinidos. Entonces, dentro de la clase Person me gustaría definir algún tipo de colección estática de cadenas a las que pueda acceder de forma aleatoria y, por lo tanto, también necesitaría saber cuántas hay.¿Cómo debo implementar una colección estática de cadenas en mi clase?

Estoy usando Qt aquí también, por lo que la solución debería ser preferiblemente usar elementos de la biblioteca estándar o la biblioteca Qt.

Soy de un fondo de Java y en Java que probablemente hacer algo como:

private static final String[] NAMES = { "A", "B" }; 

¿Cuál sería el equivalente en este caso?

Respuesta

21

Puede usar QStringList.

Person.h:

class Person 
{ 
private: 
    static QStringList names; 
}; 

Person.cpp:

QStringList Person::names = QStringList() << "Arial" << "Helvetica" 
    << "Times" << "Courier"; 
8

Suponiendo C++ 03:

class YourClass { 
    static const char*const names[]; 
    static const size_t namesSize; 
}; 

// in one of the translation units (*.cpp) 
const char*const YourClass::names[] = {"A", "B"}; 
const size_t YourClass::namesSize = sizeof(YourClass::names)/sizeof(YourClass::names[0]); 

Suponiendo C++ 0x:

class YourClass { 
    static const std::vector<const char*> names; 
}; 

// in one of the translation units (*.cpp) 
const vector<const char*> YourClass::names = {"A", "B"}; 

Y, por supuesto, se puede utilizar el tipo de la cadena favorita en lugar de const char*.

+0

Gracias por la respuesta, era difícil escoger una respuesta aceptada dado que todos ellos están bien, pero fuimos con la QStringList Responda puramente porque encaja muy bien con el hecho de que estoy tratando de aprender Qt. – DaveJohnston

+0

@Dave: Aunque puedo comprenderte, prefiero escribir un código más estándar y portátil cuando sea posible. Incluso si no es tan limpio (el ejemplo de C++ 03). – ybungalobill

4

En primer lugar, un programa muy simple para la generación de nombres al azar a partir de una matriz estática. La implementación correcta de la clase se puede encontrar más abajo.

#include <iostream> 
#include <string> 
#include <stdlib.h> 
#include <time.h> 

// import the std namespace (to avoid having to use std:: everywhere) 
using namespace std; 
// create a constant array of strings 
static string const names[] = { "James", "Morrison", 
           "Weatherby", "George", "Dupree" }; 
// determine the number of names in the array 
static int const num_names = sizeof(names)/sizeof(names[0]); 

// declare the getRandomName() function 
string getRandomName(); 

// standard main function 
int main (int argc, char * argv[]) 
{ 
    // seed the random number generator 
    srand(time(0)); 
    // pick a random name and print it 
    cout << getRandomName() << endl; 
    // return 0 (no error) 
    return 0; 
} 

// define the getRandomName() function 
string getRandomName() 
{ 
    // pick a random name (% is the modulo operator) 
    return names[rand()%num_names]; 
} 

implementación de la clase

Person.h

#ifndef PERSON_ 
#define PERSON_ 

#include <string> 

class Person 
{ 
    private: 
     std::string p_name; 
    public: 
     Person(); 
     std::string name(); 
}; 

#endif 

Person.cpp

#include "Person.h" 
#include <stdlib.h> 

using namespace std; 

static string const names[] = { "James", "Morrison", 
           "Weatherby", "George", "Dupree" }; 
static int const num_names = sizeof(names)/sizeof(names[0]); 

Person::Person() : p_name(names[rand()%num_names]) { } 
string Person::name() { return p_name; } 

main.cpp

#include <iostream> 
#include <string> 
#include <stdlib.h> 
#include <time.h> 
#include "Person.h" 

using namespace std; 

int main (int argc, char * argv[]) 
{ 
    // seed the random number generator 
    srand(time(0)); 

    // create 3 Person instances 
    Person p1, p2, p3; 

    // print their names 
    cout << p1.name() << endl; 
    cout << p2.name() << endl; 
    cout << p3.name() << endl; 

    // return 0 (no error) 
    return 0; 
} 
+0

Una buena explicación, pero 'using namespace std;' es una mala idea y puede causar un montón de problemas, muchos de los cuales se han publicado aquí en SO debido a conflictos de espacio de nombres.Toma casi-no-tiempo para escribir 'std ::'. –

+3

usando "' using namespace std; '" es malo * en un archivo de cabecera *. Usarlo en un archivo fuente está perfectamente bien. –

+0

Aunque, naturalmente, el debate se intensifica en ':)' http://stackoverflow.com/questions/1452721/why-is-using-namespace-std-considered-a-bad-practice-in-c –

Cuestiones relacionadas