Как мне реализовать статическую коллекцию строк в моем классе - PullRequest
8 голосов
/ 11 декабря 2010

Я очень плохо знаком с C ++, поэтому на этот вопрос может быть легко ответить. Я пишу класс (Person), и когда Person создается, ему должно быть назначено случайное имя из коллекции предопределенных имен. Поэтому в классе Person я хотел бы определить некоторый статический набор строк, к которым я могу получить произвольный доступ, и поэтому мне также необходимо знать, сколько их существует.

Я также использую здесь Qt, поэтому в качестве решения желательно использовать вещи из стандартной библиотеки или библиотеки Qt.

Я из Java, и, вероятно, я бы сделал что-то вроде:

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

Что будет эквивалентным в этом случае?

Ответы [ 3 ]

24 голосов
/ 11 декабря 2010

Вы можете использовать QStringList .

Person.h:

class Person
{
private:
    static QStringList names;
};

Person.cpp:

QStringList Person::names = QStringList() << "Arial" << "Helvetica" 
    << "Times" << "Courier";
9 голосов
/ 11 декабря 2010

Предполагая 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 ++ 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"};

И, конечно, вы можете использовать ваш любимый тип строки вместо const char*.

4 голосов
/ 11 декабря 2010

Во-первых, очень простая программа для генерации случайных имен из статического массива.Правильную реализацию класса можно найти ниже.

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

Реализация класса

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;
}
...