2010-12-11 54 views
7

Je suis très nouveau au C++ ainsi ceci pourrait être une question facile à répondre. J'écris une classe (Person) et quand une personne est créée, elle doit recevoir un nom aléatoire d'une collection de noms prédéfinis. Donc, dans la classe Person, je voudrais définir une sorte de collection statique de chaînes auxquelles je peux accéder de manière aléatoire et par conséquent, je devrais aussi savoir combien il y en a.Comment est-ce que je devrais implémenter une collection statique de chaînes dans ma classe

J'utilise ici aussi Qt, donc la solution devrait de préférence utiliser des choses de la bibliothèque standard ou de la bibliothèque Qt.

Je suis d'un milieu Java et en Java, je serais probablement faire quelque chose comme:

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

Quelle serait l'équivalent dans ce cas?

Répondre

21

Vous pouvez utiliser QStringList.

Person.h:

class Person 
{ 
private: 
    static QStringList names; 
}; 

Person.cpp:

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

En supposant 03 C++:

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]); 

En supposant 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"}; 

Et bien sûr, vous pouvez utiliser votre chaîne préférée de type au lieu de const char*.

+0

Merci pour la réponse, il était difficile de choisir une réponse acceptée étant donné qu'ils sont bien, mais je suis allé avec le QStringList répondre purement parce que cela correspond bien au fait que j'essaie d'apprendre Qt. – DaveJohnston

+0

@Dave: Bien que je puisse vous comprendre, je préfère toujours écrire plus de code standard et portable si possible. Même si ce n'est pas si propre (l'exemple C++ 03). – ybungalobill

4

Tout d'abord, un programme très simple pour générer des noms aléatoires à partir d'un tableau statique. L'implémentation de classe appropriée peut être trouvée plus bas.

#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]; 
} 

mise en œuvre de classe

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

Une bonne explication, mais 'using namespace std; 'est une mauvaise idée et peut causer toute une série de problèmes, dont beaucoup ont été affichés ici sur SO en raison de conflits d'espace de noms.Il faut un instant pour taper 'std ::'. –

+3

en utilisant "' using namespace std; '" est mauvais * dans un fichier d'en-tête *. L'utiliser dans un fichier source est parfaitement bien. –

+0

Bien que, naturellement, le débat fait rage sur: http://stackoverflow.com/questions/1452721/why-is-using-namespace-std-considered-a-bad-practice-in-c –