2010-12-11 2 views
7

Ich bin sehr neu in C++, so könnte dies eine einfache Frage zu beantworten sein. Ich schreibe eine Klasse (Person) und wenn eine Person erstellt wird, sollte ihr ein zufälliger Name aus einer Sammlung vordefinierter Namen zugewiesen werden. Also würde ich innerhalb der Personenklasse eine Art statische Sammlung von Strings definieren, auf die ich zufällig zugreifen kann und daher müsste ich auch wissen, wie viele es sind.Wie sollte ich eine statische Sammlung von Strings in meiner Klasse implementieren

Ich benutze Qt auch hier, also sollte die Lösung vorzugsweise Dinge aus der Standard-Bibliothek oder der Qt-Bibliothek verwenden.

Ich bin von einem Java-Hintergrund und in Java würde ich wahrscheinlich so etwas wie:

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

Was entspricht in diesem Fall wäre?

Antwort

21

Sie könnten QStringList verwenden.

Person.h:

class Person 
{ 
private: 
    static QStringList names; 
}; 

Person.cpp:

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

Unter der Annahme, 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]); 

C Unter der Annahme ++ 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"}; 

Und natürlich können Sie Ihre Lieblings Zeichenfolge anstelle von const char* eingeben.

+0

Danke für die Antwort, es war schwer, eine akzeptierte Antwort gegeben zu wählen, dass sie alles in Ordnung, aber ich ging einfach mit dem QStringList antworte rein, weil es gut zu der Tatsache passt, dass ich versuche Qt zu lernen. – DaveJohnston

+0

@Dave: Obwohl ich Sie verstehen kann, bevorzuge ich immer noch mehr Standard und tragbaren Code wo möglich zu schreiben. Auch wenn es nicht so ordentlich ist (das C++ 03-Beispiel). – ybungalobill

4

Zuerst wird ein sehr einfaches Programm für zufällige Namen aus einer statischen Array zu erzeugen. Die richtige Klassenimplementierung finden Sie weiter unten.

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

Klasse Implementierung

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

Eine gute Erklärung, aber 'using namespace std;' ist eine schlechte Idee und kann eine ganze Reihe von Problemen verursachen, von denen viele hier aufgrund von Namespace-Konflikten auf SO veröffentlicht wurden.Es dauert fast keine Zeit, um 'std ::' einzugeben. –

+3

Verwendung von "' using namespace std; '" ist schlecht * in einer Header-Datei *. Die Verwendung in einer Quelldatei ist völlig in Ordnung. –

+0

Obwohl, natürlich, tobt die Debatte auf ':)' http://stackoverflow.com/questions/1452721/why-ususing-namespace-std-constired-a-bad-practice-in-c –

Verwandte Themen